Skip to content

Commit 0db20fe

Browse files
committed
[benchmark] Fix index computation for quantiles
Turns out that both the old code in `DriverUtils` that computed median, as well as newer quartiles in `PerformanceTestSamples` had off-by-1 error. It trully is the 3rd of the 2 hard things in computer science!
1 parent 5cd9f53 commit 0db20fe

File tree

3 files changed

+12
-7
lines changed

3 files changed

+12
-7
lines changed

Diff for: benchmark/scripts/compare_perf_tests.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -141,20 +141,24 @@ def max(self):
141141
"""Maximum sampled value."""
142142
return self.samples[-1].runtime
143143

144+
def _quantile_index(self, q, i):
145+
"""Return index of the element nearest to the i-th q-quantile."""
146+
return int(round((self.count - 1) / float(q) * float(i)))
147+
144148
@property
145149
def median(self):
146150
"""Median sampled value."""
147-
return self.samples[self.count / 2].runtime
151+
return self.samples[self._quantile_index(2, 1)].runtime
148152

149153
@property
150154
def q1(self):
151155
"""First Quartile (25th Percentile)."""
152-
return self.samples[self.count / 4].runtime
156+
return self.samples[self._quantile_index(4, 1)].runtime
153157

154158
@property
155159
def q3(self):
156160
"""Third Quartile (75th Percentile)."""
157-
return self.samples[(self.count / 2) + (self.count / 4)].runtime
161+
return self.samples[self._quantile_index(4, 3)].runtime
158162

159163
@property
160164
def iqr(self):

Diff for: benchmark/scripts/test_compare_perf_tests.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,10 @@ def test_computes_five_number_summary(self):
7878
self.samples, (1000, 1000, 1100, 1100, 1100))
7979
self.samples.add(Sample(3, 1, 1050))
8080
self.assertEqualFiveNumberSummary(
81-
self.samples, (1000, 1000, 1050, 1050, 1100))
81+
self.samples, (1000, 1050, 1050, 1100, 1100))
8282
self.samples.add(Sample(4, 1, 1025))
8383
self.assertEqualFiveNumberSummary(
84-
self.samples, (1000, 1025, 1050, 1100, 1100))
84+
self.samples, (1000, 1025, 1050, 1050, 1100))
8585
self.samples.add(Sample(5, 1, 1075))
8686
self.assertEqualFiveNumberSummary(
8787
self.samples, (1000, 1025, 1050, 1075, 1100))
@@ -156,11 +156,12 @@ def test_excludes_outliers_zero_IQR(self):
156156
self.samples.add(Sample(0, 2, 23))
157157
self.samples.add(Sample(1, 2, 18))
158158
self.samples.add(Sample(2, 2, 18))
159+
self.samples.add(Sample(3, 2, 18))
159160
self.assertEquals(self.samples.iqr, 0)
160161

161162
self.samples.exclude_outliers()
162163

163-
self.assertEquals(self.samples.count, 2)
164+
self.assertEquals(self.samples.count, 3)
164165
self.assertEqualStats(
165166
(self.samples.min, self.samples.max), (18, 18))
166167

Diff for: benchmark/utils/DriverUtils.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ func runBench(_ test: BenchmarkInfo, _ c: TestConfig) -> BenchResults? {
454454
min: samples.first!, max: samples.last!,
455455
mean: UInt64(stats.mean),
456456
sd: UInt64(stats.standardDeviation),
457-
median: samples[samples.count / 2],
457+
median: samples[(samples.count - 1) / 2],
458458
maxRSS: UInt64(sampler.measureMemoryUsage()))
459459
}
460460

0 commit comments

Comments
 (0)