Skip to content

ci: benchmark variance reduction#1107

Merged
henryiii merged 1 commit into
pypa:mainfrom
notatallshaw:reduce-benchmark-variance
Mar 7, 2026
Merged

ci: benchmark variance reduction#1107
henryiii merged 1 commit into
pypa:mainfrom
notatallshaw:reduce-benchmark-variance

Conversation

@notatallshaw

@notatallshaw notatallshaw commented Mar 7, 2026

Copy link
Copy Markdown
Member

This PR does 4 things to reduce benchmark variance:

1. PYTHONHASHSEED=0

Set PYTHONHASHSEED=0 via env_nobuild in asv.conf.json to eliminate frozenset iteration order variance across process spawns.

This happens because self._specs in a SpecifierSet is a frozenset and iterating over it can have very different performance characteristics per run, we may be able to tackle this and improve performance in a separate PR, but either way we don't want hash seed differences causing benchmark differences anywhere.

Variables in 'no_build' will be passed to every environment during the test phase, but will not trigger a new build.

asv.conf.json reference

2. Interleave rounds

Added --interleave-rounds to asv continuous in CI to avoid commit-ordering bias.

Interleave benchmarks with multiple rounds across commits. This can avoid measurement biases from commit ordering, can take longer.

asv continuous reference

3. More rounds and repeats

Set rounds=4 on all benchmark classes to sample across longer time periods, I found that the default 2 rounds is simply not enough for untuned machines.

rounds: How many rounds to run the benchmark in (default: 2). The rounds run different timing benchmarks in an interleaved order, allowing to sample over longer periods of background performance variations (e.g. CPU power levels).

Benchmark attributes reference

4. Regression threshold

Reset regressions_thresholds from 0.01 (1%) to the default 0.05 (5%). Noise on micro-benchmarks easily exceeds 1%, we should only consider performance wins or gains on micro-benchmarks of >5%, we could set tighter or looser results for specific benchmarks if we wanted.

If no entry matches, the default threshold is 0.05 (iow. 5%).

asv.conf.json reference

@notatallshaw

Copy link
Copy Markdown
Member Author

Result:

All benchmarks:
| Change   | Before [55dfb87d]    | After [c1ece664]    |   Ratio | Benchmark (Parameter)                                                                               |
|----------|----------------------|---------------------|---------|-----------------------------------------------------------------------------------------------------|
|          | 5.84±0.09ms          | 5.71±0.07ms         |    0.98 | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]          |
|          | 4.04±0.06ms          | 4.04±0.06ms         |    1    | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]          |
|          | 4.49±0.03ms          | 4.55±0.04ms         |    1.01 | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]          |
|          | 4.48±0.03ms          | 4.51±0.07ms         |    1.01 | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]          |
|          | 4.42±0.04ms          | 4.42±0.02ms         |    1    | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]          |
|          | 5.84±0.1ms           | 5.89±0.04ms         |    1.01 | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]           |
|          | 5.96±0.06ms          | 6.06±0.07ms         |    1.02 | markers.TimeMarkerSuite.time_constructor [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]           |
|          | 1.82±0.03ms          | 1.83±0.02ms         |    1.01 | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]             |
|          | 1.22±0.02ms          | 1.21±0.02ms         |    0.99 | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]             |
|          | 1.37±0.03ms          | 1.34±0.02ms         |    0.98 | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]             |
|          | 1.28±0.01ms          | 1.27±0.01ms         |    0.99 | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]             |
|          | 1.30±0.01ms          | 1.30±0.01ms         |    1    | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]             |
|          | 1.88±0.04ms          | 1.93±0.03ms         |    1.03 | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]              |
|          | 1.82±0.02ms          | 1.82±0.03ms         |    1    | markers.TimeMarkerSuite.time_evaluate [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]              |
|          | 26.0±0.1ms           | 26.0±0.1ms          |    1    | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0] |
|          | 18.5±0.3ms           | 18.5±0.3ms          |    1    | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0] |
|          | 20.4±0.4ms           | 20.2±0.2ms          |    0.99 | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0] |
|          | 20.1±0.2ms           | 20.2±0.09ms         |    1    | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0] |
|          | 20.7±0.2ms           | 20.9±0.5ms          |    1.01 | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0] |
|          | 27.2±0.2ms           | 27.5±0.4ms          |    1.01 | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]  |
|          | 27.2±0.09ms          | 27.0±0.2ms          |    0.99 | requirement.TimeRequirementSuite.time_constructor [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]  |
|          | 1.28±0.01ms          | 1.28±0.01ms         |    0.99 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]     |
|          | 882±8μs              | 872±7μs             |    0.99 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]     |
|          | 896±10μs             | 895±20μs            |    1    | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]     |
|          | 875±20μs             | 866±2μs             |    0.99 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]     |
|          | 850±4μs              | 864±9μs             |    1.02 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]     |
|          | 1.33±0ms             | 1.32±0.01ms         |    1    | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]      |
|          | 1.31±0.01ms          | 1.30±0ms            |    0.99 | resolver.TimeResolverSuite.time_resolver_loop [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]      |
|          | 6.60±0.08ms          | 6.69±0.06ms         |    1.01 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]         |
|          | 4.83±0.04ms          | 4.83±0.03ms         |    1    | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]         |
|          | 5.31±0.03ms          | 5.32±0.05ms         |    1    | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]         |
|          | 4.81±0.04ms          | 4.91±0.05ms         |    1.02 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]         |
|          | 4.77±0.06ms          | 4.78±0.05ms         |    1    | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]         |
|          | 7.00±0.06ms          | 6.92±0.04ms         |    0.99 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]          |
|          | 6.86±0.07ms          | 6.77±0.03ms         |    0.99 | specifiers.TimeSpecSuite.time_constructor [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]          |
|          | 8.71±0.04ms          | 8.73±0.04ms         |    1    | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]       |
|          | 6.23±0.05ms          | 6.19±0.05ms         |    0.99 | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]       |
|          | 6.74±0.1ms           | 6.75±0.07ms         |    1    | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]       |
|          | 6.54±0.06ms          | 6.51±0.03ms         |    0.99 | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]       |
|          | 6.41±0.2ms           | 6.41±0.08ms         |    1    | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]       |
|          | 9.34±0.2ms           | 9.32±0.1ms          |    1    | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]        |
|          | 9.03±0.05ms          | 9.10±0.1ms          |    1.01 | specifiers.TimeSpecSuite.time_contains_cold [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]        |
|          | 6.36±0.03ms          | 6.37±0.06ms         |    1    | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]       |
|          | 4.73±0.03ms          | 4.78±0.05ms         |    1.01 | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]       |
|          | 5.20±0.05ms          | 5.19±0.1ms          |    1    | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]       |
|          | 4.88±0.02ms          | 4.88±0.08ms         |    1    | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]       |
|          | 4.84±0.04ms          | 4.85±0.07ms         |    1    | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]       |
|          | 6.77±0.07ms          | 6.75±0.04ms         |    1    | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]        |
|          | 6.61±0.05ms          | 6.60±0.03ms         |    1    | specifiers.TimeSpecSuite.time_contains_warm [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]        |
|          | 18.2±0.05μs          | 18.2±0.2μs          |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]  |
|          | 11.8±0.07μs          | 11.8±0.07μs         |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]  |
|          | 10.4±0.04μs          | 10.3±0.07μs         |    0.99 | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]  |
|          | 10.1±0.2μs           | 10.1±0.09μs         |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]  |
|          | 9.77±0.06μs          | 9.76±0.07μs         |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]  |
|          | 19.1±0.06μs          | 19.1±0.1μs          |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]   |
|          | 18.9±0.09μs          | 18.9±0.3μs          |    1    | specifiers.TimeSpecSuite.time_filter_simple_cold [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]   |
|          | 16.1±0.3μs           | 15.7±0.09μs         |    0.98 | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]  |
|          | 10.2±0.05μs          | 10.3±0.1μs          |    1.01 | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]  |
|          | 8.51±0.06μs          | 8.40±0.1μs          |    0.99 | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]  |
|          | 8.57±0.06μs          | 8.55±0.1μs          |    1    | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]  |
|          | 8.21±0.05μs          | 8.19±0.03μs         |    1    | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]  |
|          | 16.4±0.07μs          | 16.5±0.1μs          |    1.01 | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]   |
|          | 16.2±0.07μs          | 16.2±0.1μs          |    1    | specifiers.TimeSpecSuite.time_filter_simple_warm [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]   |
|          | 5.00±0.04μs          | 5.03±0.03μs         |    1.01 | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]            |
|          | 3.50±0.08μs          | 3.49±0.04μs         |    1    | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]            |
|          | 3.69±0.08μs          | 3.59±0.03μs         |    0.97 | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]            |
|          | 3.70±0.03μs          | 3.74±0.06μs         |    1.01 | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]            |
|          | 4.09±0.01μs          | 4.09±0.02μs         |    1    | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]            |
|          | 5.57±0.06μs          | 5.56±0.03μs         |    1    | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]             |
|          | 5.41±0.02μs          | 5.47±0.04μs         |    1.01 | utils.TimeUtils.time_canonicalize_name [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]             |
|          | 2.65±0.03ms          | 2.65±0.02ms         |    1    | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]         |
|          | 1.73±0.01ms          | 1.73±0.02ms         |    1    | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]         |
|          | 2.15±0.02ms          | 2.14±0.01ms         |    1    | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]         |
|          | 1.94±0.01ms          | 1.95±0.01ms         |    1    | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]         |
|          | 1.73±0.01ms          | 1.74±0.01ms         |    1    | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]         |
|          | 2.84±0.01ms          | 2.84±0.01ms         |    1    | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]          |
|          | 2.78±0.02ms          | 2.79±0.03ms         |    1.01 | version.TimeVersionSuite.time_constructor [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]          |
|          | 4.54±0.02ms          | 4.47±0.03ms         |    0.98 | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]                |
|          | 2.95±0.02ms          | 2.96±0.03ms         |    1.01 | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]                |
|          | 3.55±0.03ms          | 3.57±0.02ms         |    1.01 | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]                |
|          | 3.37±0.03ms          | 3.34±0.02ms         |    0.99 | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]                |
|          | 3.23±0.03ms          | 3.24±0.02ms         |    1    | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]                |
|          | 4.75±0.05ms          | 4.73±0.02ms         |    1    | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]                 |
|          | 4.57±0.02ms          | 4.58±0.04ms         |    1    | version.TimeVersionSuite.time_hash [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]                 |
|          | 2.81±0.03ms          | 2.81±0.02ms         |    1    | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]           |
|          | 2.03±0.03ms          | 2.03±0.01ms         |    1    | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]           |
|          | 2.26±0.01ms          | 2.26±0.01ms         |    1    | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]           |
|          | 2.36±0.02ms          | 2.36±0.01ms         |    1    | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]           |
|          | 2.34±0.02ms          | 2.35±0.01ms         |    1    | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]           |
|          | 3.53±0.02ms          | 3.52±0.03ms         |    1    | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]            |
|          | 3.28±0.01ms          | 3.37±0.05ms         |    1.03 | version.TimeVersionSuite.time_sort_cold [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]            |
|          | 2.22±0.02ms          | 2.21±0.02ms         |    1    | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]           |
|          | 1.67±0.01ms          | 1.66±0.01ms         |    0.99 | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]           |
|          | 1.87±0.01ms          | 1.88±0.02ms         |    1    | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]           |
|          | 1.96±0.01ms          | 1.95±0.01ms         |    1    | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]           |
|          | 1.97±0.01ms          | 1.96±0.01ms         |    1    | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]           |
|          | 2.84±0.01ms          | 2.84±0.01ms         |    1    | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]            |
|          | 2.56±0.01ms          | 2.57±0.03ms         |    1.01 | version.TimeVersionSuite.time_sort_warm [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]            |
|          | 4.36±0.05ms          | 4.34±0.04ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.10-PYTHONHASHSEED0]                 |
|          | 3.11±0.02ms          | 3.12±0.02ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.11-PYTHONHASHSEED0]                 |
|          | 3.52±0.02ms          | 3.50±0.01ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.12-PYTHONHASHSEED0]                 |
|          | 3.15±0.02ms          | 3.14±0.02ms         |    1    | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.13-PYTHONHASHSEED0]                 |
|          | 3.09±0.04ms          | 3.11±0.06ms         |    1.01 | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.14-PYTHONHASHSEED0]                 |
|          | 4.87±0.02ms          | 4.90±0.03ms         |    1.01 | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.8-PYTHONHASHSEED0]                  |
|          | 4.64±0.02ms          | 4.77±0.06ms         |    1.03 | version.TimeVersionSuite.time_str [runnervm0kj6c/virtualenv-py3.9-PYTHONHASHSEED0]                  |
BENCHMARKS NOT SIGNIFICANTLY CHANGED.

@henryiii

henryiii commented Mar 7, 2026

Copy link
Copy Markdown
Contributor

Sounds good, especially the regression threshold (though I'm mostly looking at these as statistics, not paying attention to the +/- that much). Interleaving might be especially nice on CI, where we don't have dedicated hardware.

@henryiii henryiii merged commit 20f1523 into pypa:main Mar 7, 2026
56 checks passed
@henryiii henryiii changed the title Benchmark variance reduction chore: benchmark variance reduction Mar 7, 2026
@henryiii henryiii changed the title chore: benchmark variance reduction ci: benchmark variance reduction Mar 7, 2026
ngoldbaum pushed a commit to ngoldbaum/packaging that referenced this pull request Apr 1, 2026
This was referenced Apr 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants