11"""Microbenchmark compact vs wide int add/sub with pyperf.
22
3- Use this with PYTHON_JIT=0 and -S if you want a stable interpreter-only run:
3+ Use this with PYTHON_JIT=0 for a stable interpreter-only run:
44
5- PYTHON_JIT=0 ./python.exe -S Tools/scripts/bench_wide_int_pyperf.py
5+ PYTHON_JIT=0 ./python.exe Tools/scripts/bench_wide_int_pyperf.py
66"""
77
88from __future__ import annotations
99
1010import pyperf
1111
12+ _BATCH = 10_000
13+ _sink = 0
1214
13- def bench_add_compact () -> int :
14- a = 1
15- b = 2
16- return a + b
1715
16+ def _bench_add (a : int , b : int ) -> None :
17+ global _sink
18+ x = 0
19+ for _ in range (_BATCH ):
20+ x = a + b
21+ _sink = x
1822
19- def bench_add_wide () -> int :
20- a = 10_000_000_000
21- b = 1
22- return a + b
2323
24+ def _bench_sub (a : int , b : int ) -> None :
25+ global _sink
26+ x = 0
27+ for _ in range (_BATCH ):
28+ x = a - b
29+ _sink = x
2430
25- def bench_sub_compact () -> int :
26- a = 1
27- b = 2
28- return a - b
2931
32+ def bench_add_compact () -> None :
33+ _bench_add (1 , 2 )
3034
31- def bench_sub_wide () -> int :
32- a = 10_000_000_000
33- b = 1
34- return a - b
35+
36+ def bench_add_wide () -> None :
37+ _bench_add (1 << 40 , 1 )
38+
39+
40+ def bench_sub_compact () -> None :
41+ _bench_sub (1 , 2 )
42+
43+
44+ def bench_sub_wide () -> None :
45+ _bench_sub (1 << 40 , 1 )
46+
47+
48+ def bench_chain_compact () -> None :
49+ global _sink
50+ total = 0
51+ a = 2000
52+ b = 3
53+ c = 4000
54+ for _ in range (_BATCH ):
55+ total += a * b + c
56+ _sink = total
57+
58+
59+ def bench_chain_wide () -> None :
60+ global _sink
61+ total = 0
62+ a = 1 << 40
63+ b = 3
64+ c = 1 << 20
65+ for _ in range (_BATCH ):
66+ total += a * b + c
67+ _sink = total
3568
3669
3770def main () -> None :
@@ -40,6 +73,8 @@ def main() -> None:
4073 runner .bench_func ("add_wide" , bench_add_wide )
4174 runner .bench_func ("sub_compact" , bench_sub_compact )
4275 runner .bench_func ("sub_wide" , bench_sub_wide )
76+ runner .bench_func ("chain_compact" , bench_chain_compact )
77+ runner .bench_func ("chain_wide" , bench_chain_wide )
4378
4479
4580if __name__ == "__main__" :
0 commit comments