Commit b277a75
Fix panic with uniform iteration durations in benchmarks
When all benchmark iterations report identical durations, criterion.rs would panic during chart generation with "assertion failed: !(range.0.is_nan() || range.1.is_nan())". This occurred because the Silverman bandwidth calculation produced zero when standard deviation was zero, leading to division by zero in the KDE sweep code and ultimately NaN values in chart coordinates.
This fix adds a fallback bandwidth when standard deviation is zero, using 1% of the data range (or 1% of the absolute value if all values are identical, or a minimal epsilon for all-zero data). This is semantically correct because KDE assumes data has spread; when variance is zero, we provide minimal artificial bandwidth to create a narrow distribution centered on the actual value.
The fix is scale-invariant and handles all edge cases while preserving existing behavior for benchmarks with variance.
Fixes #8731 parent 828af14 commit b277a75
2 files changed
Lines changed: 35 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
82 | | - | |
83 | | - | |
84 | | - | |
85 | | - | |
86 | | - | |
87 | | - | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
88 | 105 | | |
89 | 106 | | |
90 | 107 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
465 | 465 | | |
466 | 466 | | |
467 | 467 | | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
468 | 480 | | |
469 | 481 | | |
470 | 482 | | |
| |||
0 commit comments