Skip to content

Commit 2737165

Browse files
committed
fix off-by-one error causing Infinity in 100% EIL
1 parent 606e74b commit 2737165

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

lighthouse-core/lib/traces/tracing-processor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ class TraceProcessor {
165165
// Loop over durations, calculating a CDF value for each until it is above
166166
// the target percentile.
167167
const percentileTime = percentile * totalTime;
168-
while (cdfTime < percentileTime && durationIndex < durations.length) {
168+
while (cdfTime < percentileTime && durationIndex < durations.length - 1) {
169169
completedTime += duration;
170170
remainingCount -= (duration < 0 ? -1 : 1);
171171

lighthouse-core/test/lib/traces/tracing-processor.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,5 +140,17 @@ describe('TracingProcessor lib', () => {
140140
[16, 16, 16, 31, 46, 55, 56]);
141141
assert.deepEqual(results, expected);
142142
});
143+
144+
it('does not divide by zero when duration sum is less than whole', () => {
145+
// Durations chosen such that, due to floating point error:
146+
// const idleTime = totalTime - (duration1 + duration2);
147+
// (idleTime + duration1 + duration2) < totalTime
148+
const duration1 = 67 / 107;
149+
const duration2 = 67 / 53;
150+
const totalTime = 10;
151+
const results = TracingProcessor._riskPercentiles([duration1, duration2], totalTime, [1], 0);
152+
const expected = createRiskPercentiles([1], [16 + duration2]);
153+
assert.deepEqual(results, expected);
154+
});
143155
});
144156
});

0 commit comments

Comments
 (0)