Repository navigation
Support PGO for clang-cl #130090
Description
Feature or enhancement
Proposal:
Support PGO (profile guided optimization) for clang-cl on Windows using a similar approach as done in the Linux makefiles for clang.
Has this already been discussed elsewhere?
No response given
Links to previous discussion of this feature:
Discussion has started in the PR #129907 while being draft.
Linked PRs
64bit pyperformance results on my Windows 10 PC (dusty i5-4570 CPU) run with --fast --affinity 0 for commit 9db1a29 with
- Microsoft Visual Studio 2022 17.13.0 Preview 5.0 which can do PGO again (Remove #pragma that disables optimization on _PyEval_EvalFrameDefault on MSVC #129244)
- which ships with clang-cl 19.1.1
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 | msvc.pgo.9db1a297d9 | clang.pgo.9db1a297d9 |
|---|---|---|---|---|
| Geometric mean | (ref) | 1.27x faster | 1.28x faster | 1.47x faster |
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 |
|---|---|---|
| Geometric mean | (ref) | 1.27x faster |
clang 18.1.8 is faster than 19.1.1, and 20.1.0.rc2 with tailcalling is the fastest:
| Benchmark | msvc.pgo.9db1a297d9 | clang.pgo.18.1.8.9db1a297d9 | clang.pgo.9db1a297d9 | clang.pgo.tc.20.1.0.rc2.9db1a297d9 |
|---|---|---|---|---|
| Geometric mean | (ref) | 1.19x faster | 1.15x faster | 1.25x faster |
Details
Benchmarks with tag 'apps':
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 | msvc.pgo.9db1a297d9 | clang.pgo.9db1a297d9 |
|---|---|---|---|---|
| 2to3 | 586 ms | 491 ms: 1.19x faster | 462 ms: 1.27x faster | 426 ms: 1.38x faster |
| docutils | 4.27 sec | 3.75 sec: 1.14x faster | 3.50 sec: 1.22x faster | 3.31 sec: 1.29x faster |
| html5lib | 104 ms | 81.6 ms: 1.28x faster | 77.9 ms: 1.34x faster | 74.5 ms: 1.40x faster |
| Geometric mean | (ref) | 1.20x faster | 1.28x faster | 1.35x faster |
Benchmarks with tag 'asyncio':
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 | msvc.pgo.9db1a297d9 | clang.pgo.9db1a297d9 |
|---|---|---|---|---|
| async_tree_none | 511 ms | 383 ms: 1.33x faster | 394 ms: 1.30x faster | 357 ms: 1.43x faster |
| async_tree_cpu_io_mixed | 933 ms | 805 ms: 1.16x faster | 749 ms: 1.25x faster | 697 ms: 1.34x faster |
| async_tree_cpu_io_mixed_tg | 891 ms | 776 ms: 1.15x faster | 716 ms: 1.24x faster | 665 ms: 1.34x faster |
| async_tree_eager | 209 ms | 153 ms: 1.37x faster | 160 ms: 1.31x faster | 133 ms: 1.57x faster |
| async_tree_eager_cpu_io_mixed | 656 ms | 630 ms: 1.04x faster | 567 ms: 1.16x faster | 535 ms: 1.23x faster |
| async_tree_eager_cpu_io_mixed_tg | 830 ms | 741 ms: 1.12x faster | 681 ms: 1.22x faster | 646 ms: 1.28x faster |
| async_tree_eager_io | 1.12 sec | 870 ms: 1.29x faster | 874 ms: 1.28x faster | 817 ms: 1.37x faster |
| async_tree_eager_io_tg | 1.12 sec | 890 ms: 1.26x faster | 898 ms: 1.25x faster | 840 ms: 1.33x faster |
| async_tree_eager_memoization | 393 ms | 304 ms: 1.29x faster | 304 ms: 1.29x faster | 281 ms: 1.40x faster |
| async_tree_eager_memoization_tg | 546 ms | 420 ms: 1.30x faster | 427 ms: 1.28x faster | 397 ms: 1.37x faster |
| async_tree_eager_tg | 408 ms | 312 ms: 1.31x faster | 321 ms: 1.27x faster | 297 ms: 1.38x faster |
| async_tree_io | 1.14 sec | 868 ms: 1.31x faster | 889 ms: 1.28x faster | 824 ms: 1.38x faster |
| async_tree_io_tg | 1.14 sec | 871 ms: 1.31x faster | 877 ms: 1.30x faster | 807 ms: 1.41x faster |
| async_tree_memoization | 649 ms | 493 ms: 1.32x faster | 509 ms: 1.28x faster | 458 ms: 1.42x faster |
| async_tree_memoization_tg | 605 ms | 453 ms: 1.34x faster | 462 ms: 1.31x faster | 425 ms: 1.42x faster |
| async_tree_none_tg | 497 ms | 371 ms: 1.34x faster | 382 ms: 1.30x faster | 352 ms: 1.41x faster |
| Geometric mean | (ref) | 1.26x faster | 1.27x faster | 1.38x faster |
Benchmarks with tag 'math':
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 | msvc.pgo.9db1a297d9 | clang.pgo.9db1a297d9 |
|---|---|---|---|---|
| float | 145 ms | 108 ms: 1.35x faster | 116 ms: 1.25x faster | 96.8 ms: 1.50x faster |
| nbody | 203 ms | 155 ms: 1.31x faster | 171 ms: 1.19x faster | 128 ms: 1.58x faster |
| pidigits | 245 ms | 250 ms: 1.02x slower | 250 ms: 1.02x slower | 240 ms: 1.02x faster |
| Geometric mean | (ref) | 1.20x faster | 1.13x faster | 1.34x faster |
Benchmarks with tag 'regex':
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 | msvc.pgo.9db1a297d9 | clang.pgo.9db1a297d9 |
|---|---|---|---|---|
| regex_compile | 237 ms | 180 ms: 1.31x faster | 180 ms: 1.31x faster | 157 ms: 1.51x faster |
| regex_dna | 226 ms | 256 ms: 1.14x slower | 210 ms: 1.07x faster | 211 ms: 1.07x faster |
| regex_effbot | 4.05 ms | not significant | 3.66 ms: 1.11x faster | 3.39 ms: 1.20x faster |
| regex_v8 | 38.7 ms | 35.7 ms: 1.08x faster | 33.7 ms: 1.15x faster | 29.8 ms: 1.30x faster |
| Geometric mean | (ref) | 1.06x faster | 1.16x faster | 1.26x faster |
Benchmarks with tag 'serialize':
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 | msvc.pgo.9db1a297d9 | clang.pgo.9db1a297d9 |
|---|---|---|---|---|
| json_dumps | 19.6 ms | 16.9 ms: 1.16x faster | 15.0 ms: 1.31x faster | 12.9 ms: 1.52x faster |
| json_loads | 48.1 us | 46.7 us: 1.03x faster | 36.8 us: 1.31x faster | 32.7 us: 1.47x faster |
| pickle | 21.5 us | 17.9 us: 1.20x faster | 19.1 us: 1.13x faster | 15.0 us: 1.44x faster |
| pickle_dict | 46.0 us | 34.3 us: 1.34x faster | 43.2 us: 1.07x faster | 27.6 us: 1.67x faster |
| pickle_list | 8.16 us | 6.19 us: 1.32x faster | 6.89 us: 1.18x faster | 5.05 us: 1.62x faster |
| pickle_pure_python | 672 us | 455 us: 1.48x faster | 463 us: 1.45x faster | 378 us: 1.78x faster |
| tomli_loads | 3.84 sec | 2.79 sec: 1.38x faster | 2.88 sec: 1.33x faster | 2.38 sec: 1.61x faster |
| unpickle | 26.2 us | 24.0 us: 1.09x faster | 19.8 us: 1.32x faster | 17.9 us: 1.46x faster |
| unpickle_list | 7.29 us | 6.03 us: 1.21x faster | 6.87 us: 1.06x faster | 5.38 us: 1.36x faster |
| unpickle_pure_python | 505 us | 321 us: 1.57x faster | 336 us: 1.50x faster | 257 us: 1.96x faster |
| xml_etree_parse | 232 ms | 228 ms: 1.02x faster | 200 ms: 1.16x faster | 210 ms: 1.10x faster |
| xml_etree_iterparse | 185 ms | 160 ms: 1.16x faster | 154 ms: 1.21x faster | 145 ms: 1.27x faster |
| xml_etree_generate | 181 ms | 148 ms: 1.22x faster | 135 ms: 1.35x faster | 119 ms: 1.53x faster |
| xml_etree_process | 128 ms | 100 ms: 1.28x faster | 94.4 ms: 1.36x faster | 82.0 ms: 1.56x faster |
| Geometric mean | (ref) | 1.24x faster | 1.26x faster | 1.51x faster |
Benchmarks with tag 'startup':
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 | msvc.pgo.9db1a297d9 | clang.pgo.9db1a297d9 |
|---|---|---|---|---|
| python_startup | 45.4 ms | not significant | 43.1 ms: 1.05x faster | 43.7 ms: 1.04x faster |
| python_startup_no_site | 37.1 ms | not significant | 35.4 ms: 1.05x faster | 35.9 ms: 1.03x faster |
| Geometric mean | (ref) | 1.00x faster | 1.05x faster | 1.04x faster |
Benchmarks with tag 'template':
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 | msvc.pgo.9db1a297d9 | clang.pgo.9db1a297d9 |
|---|---|---|---|---|
| django_template | 75.6 ms | 55.6 ms: 1.36x faster | 52.1 ms: 1.45x faster | 42.1 ms: 1.79x faster |
| genshi_text | 44.5 ms | 31.4 ms: 1.42x faster | 32.5 ms: 1.37x faster | 26.3 ms: 1.69x faster |
| genshi_xml | 102 ms | 74.0 ms: 1.37x faster | 74.6 ms: 1.36x faster | 63.1 ms: 1.61x faster |
| mako | 23.3 ms | 17.7 ms: 1.31x faster | 16.7 ms: 1.39x faster | 14.4 ms: 1.61x faster |
| Geometric mean | (ref) | 1.36x faster | 1.39x faster | 1.67x faster |
All benchmarks:
| Benchmark | msvc.release.9db1a297d9 | clang.release.9db1a297d9 | msvc.pgo.9db1a297d9 | clang.pgo.9db1a297d9 |
|---|---|---|---|---|
| 2to3 | 586 ms | 491 ms: 1.19x faster | 462 ms: 1.27x faster | 426 ms: 1.38x faster |
| async_generators | 696 ms | 565 ms: 1.23x faster | 577 ms: 1.21x faster | 514 ms: 1.35x faster |
| async_tree_none | 511 ms | 383 ms: 1.33x faster | 394 ms: 1.30x faster | 357 ms: 1.43x faster |
| async_tree_cpu_io_mixed | 933 ms | 805 ms: 1.16x faster | 749 ms: 1.25x faster | 697 ms: 1.34x faster |
| async_tree_cpu_io_mixed_tg | 891 ms | 776 ms: 1.15x faster | 716 ms: 1.24x faster | 665 ms: 1.34x faster |
| async_tree_eager | 209 ms | 153 ms: 1.37x faster | 160 ms: 1.31x faster | 133 ms: 1.57x faster |
| async_tree_eager_cpu_io_mixed | 656 ms | 630 ms: 1.04x faster | 567 ms: 1.16x faster | 535 ms: 1.23x faster |
| async_tree_eager_cpu_io_mixed_tg | 830 ms | 741 ms: 1.12x faster | 681 ms: 1.22x faster | 646 ms: 1.28x faster |
| async_tree_eager_io | 1.12 sec | 870 ms: 1.29x faster | 874 ms: 1.28x faster | 817 ms: 1.37x faster |
| async_tree_eager_io_tg | 1.12 sec | 890 ms: 1.26x faster | 898 ms: 1.25x faster | 840 ms: 1.33x faster |
| async_tree_eager_memoization | 393 ms | 304 ms: 1.29x faster | 304 ms: 1.29x faster | 281 ms: 1.40x faster |
| async_tree_eager_memoization_tg | 546 ms | 420 ms: 1.30x faster | 427 ms: 1.28x faster | 397 ms: 1.37x faster |
| async_tree_eager_tg | 408 ms | 312 ms: 1.31x faster | 321 ms: 1.27x faster | 297 ms: 1.38x faster |
| async_tree_io | 1.14 sec | 868 ms: 1.31x faster | 889 ms: 1.28x faster | 824 ms: 1.38x faster |
| async_tree_io_tg | 1.14 sec | 871 ms: 1.31x faster | 877 ms: 1.30x faster | 807 ms: 1.41x faster |
| async_tree_memoization | 649 ms | 493 ms: 1.32x faster | 509 ms: 1.28x faster | 458 ms: 1.42x faster |
| async_tree_memoization_tg | 605 ms | 453 ms: 1.34x faster | 462 ms: 1.31x faster | 425 ms: 1.42x faster |
| async_tree_none_tg | 497 ms | 371 ms: 1.34x faster | 382 ms: 1.30x faster | 352 ms: 1.41x faster |
| asyncio_tcp | 1.64 sec | 1.55 sec: 1.06x faster | 1.48 sec: 1.11x faster | not significant |
| asyncio_websockets | 732 ms | 578 ms: 1.27x faster | 758 ms: 1.04x slower | not significant |
| chaos | 132 ms | 88.6 ms: 1.48x faster | 90.8 ms: 1.45x faster | 74.3 ms: 1.77x faster |
| comprehensions | 34.7 us | 24.5 us: 1.42x faster | 25.2 us: 1.38x faster | 19.2 us: 1.80x faster |
| bench_mp_pool | 213 ms | 196 ms: 1.09x faster | 177 ms: 1.20x faster | 190 ms: 1.12x faster |
| bench_thread_pool | 1.95 ms | 1.74 ms: 1.12x faster | 1.68 ms: 1.16x faster | 1.63 ms: 1.19x faster |
| coroutines | 45.3 ms | 33.9 ms: 1.34x faster | 36.1 ms: 1.25x faster | 26.9 ms: 1.68x faster |
| coverage | 130 ms | 119 ms: 1.09x faster | 120 ms: 1.09x faster | 103 ms: 1.26x faster |
| crypto_pyaes | 147 ms | 109 ms: 1.35x faster | 109 ms: 1.35x faster | 86.3 ms: 1.70x faster |
| deepcopy | 516 us | 391 us: 1.32x faster | 388 us: 1.33x faster | 309 us: 1.67x faster |
| deepcopy_reduce | 5.30 us | 4.19 us: 1.26x faster | 3.95 us: 1.34x faster | 3.23 us: 1.64x faster |
| deepcopy_memo | 67.1 us | 41.6 us: 1.61x faster | 46.8 us: 1.44x faster | 34.8 us: 1.93x faster |
| deltablue | 7.72 ms | 4.52 ms: 1.71x faster | 4.92 ms: 1.57x faster | 3.80 ms: 2.03x faster |
| django_template | 75.6 ms | 55.6 ms: 1.36x faster | 52.1 ms: 1.45x faster | 42.1 ms: 1.79x faster |
| docutils | 4.27 sec | 3.75 sec: 1.14x faster | 3.50 sec: 1.22x faster | 3.31 sec: 1.29x faster |
| dulwich_log | 156 ms | 141 ms: 1.11x faster | 129 ms: 1.20x faster | 131 ms: 1.19x faster |
| fannkuch | 770 ms | 592 ms: 1.30x faster | 637 ms: 1.21x faster | 516 ms: 1.49x faster |
| float | 145 ms | 108 ms: 1.35x faster | 116 ms: 1.25x faster | 96.8 ms: 1.50x faster |
| create_gc_cycles | 1.62 ms | 1.71 ms: 1.05x slower | not significant | 1.71 ms: 1.05x slower |
| gc_traversal | 5.03 ms | not significant | 4.02 ms: 1.25x faster | 5.71 ms: 1.13x slower |
| generators | 65.1 ms | 40.4 ms: 1.61x faster | 44.4 ms: 1.47x faster | 36.0 ms: 1.81x faster |
| genshi_text | 44.5 ms | 31.4 ms: 1.42x faster | 32.5 ms: 1.37x faster | 26.3 ms: 1.69x faster |
| genshi_xml | 102 ms | 74.0 ms: 1.37x faster | 74.6 ms: 1.36x faster | 63.1 ms: 1.61x faster |
| go | 255 ms | 147 ms: 1.73x faster | 170 ms: 1.50x faster | 132 ms: 1.94x faster |
| hexiom | 13.4 ms | 8.49 ms: 1.58x faster | 9.22 ms: 1.46x faster | 7.11 ms: 1.89x faster |
| html5lib | 104 ms | 81.6 ms: 1.28x faster | 77.9 ms: 1.34x faster | 74.5 ms: 1.40x faster |
| json_dumps | 19.6 ms | 16.9 ms: 1.16x faster | 15.0 ms: 1.31x faster | 12.9 ms: 1.52x faster |
| json_loads | 48.1 us | 46.7 us: 1.03x faster | 36.8 us: 1.31x faster | 32.7 us: 1.47x faster |
| logging_format | 21.2 us | 16.4 us: 1.29x faster | 14.7 us: 1.44x faster | 13.6 us: 1.56x faster |
| logging_silent | 213 ns | 143 ns: 1.49x faster | 152 ns: 1.40x faster | 109 ns: 1.95x faster |
| logging_simple | 19.4 us | 14.6 us: 1.33x faster | 13.5 us: 1.44x faster | 12.2 us: 1.60x faster |
| mako | 23.3 ms | 17.7 ms: 1.31x faster | 16.7 ms: 1.39x faster | 14.4 ms: 1.61x faster |
| mdp | 3.99 sec | 4.12 sec: 1.03x slower | 3.76 sec: 1.06x faster | 3.37 sec: 1.18x faster |
| meteor_contest | 175 ms | 133 ms: 1.32x faster | 139 ms: 1.26x faster | 124 ms: 1.41x faster |
| nbody | 203 ms | 155 ms: 1.31x faster | 171 ms: 1.19x faster | 128 ms: 1.58x faster |
| nqueens | 179 ms | 129 ms: 1.38x faster | 131 ms: 1.37x faster | 103 ms: 1.73x faster |
| pathlib | 278 ms | 266 ms: 1.04x faster | 256 ms: 1.09x faster | 262 ms: 1.06x faster |
| pickle | 21.5 us | 17.9 us: 1.20x faster | 19.1 us: 1.13x faster | 15.0 us: 1.44x faster |
| pickle_dict | 46.0 us | 34.3 us: 1.34x faster | 43.2 us: 1.07x faster | 27.6 us: 1.67x faster |
| pickle_list | 8.16 us | 6.19 us: 1.32x faster | 6.89 us: 1.18x faster | 5.05 us: 1.62x faster |
| pickle_pure_python | 672 us | 455 us: 1.48x faster | 463 us: 1.45x faster | 378 us: 1.78x faster |
| pidigits | 245 ms | 250 ms: 1.02x slower | 250 ms: 1.02x slower | 240 ms: 1.02x faster |
| pprint_safe_repr | 1.46 sec | 1.09 sec: 1.34x faster | 1.09 sec: 1.34x faster | 934 ms: 1.57x faster |
| pprint_pformat | 3.00 sec | 2.22 sec: 1.35x faster | 2.23 sec: 1.35x faster | 1.91 sec: 1.57x faster |
| pyflate | 875 ms | 626 ms: 1.40x faster | 668 ms: 1.31x faster | 537 ms: 1.63x faster |
| python_startup | 45.4 ms | not significant | 43.1 ms: 1.05x faster | 43.7 ms: 1.04x faster |
| python_startup_no_site | 37.1 ms | not significant | 35.4 ms: 1.05x faster | 35.9 ms: 1.03x faster |
| raytrace | 587 ms | 385 ms: 1.52x faster | 414 ms: 1.42x faster | 321 ms: 1.83x faster |
| regex_compile | 237 ms | 180 ms: 1.31x faster | 180 ms: 1.31x faster | 157 ms: 1.51x faster |
| regex_dna | 226 ms | 256 ms: 1.14x slower | 210 ms: 1.07x faster | 211 ms: 1.07x faster |
| regex_effbot | 4.05 ms | not significant | 3.66 ms: 1.11x faster | 3.39 ms: 1.20x faster |
| regex_v8 | 38.7 ms | 35.7 ms: 1.08x faster | 33.7 ms: 1.15x faster | 29.8 ms: 1.30x faster |
| richards | 102 ms | 65.3 ms: 1.56x faster | 64.7 ms: 1.58x faster | 49.7 ms: 2.05x faster |
| richards_super | 116 ms | 74.3 ms: 1.57x faster | 74.7 ms: 1.56x faster | 56.2 ms: 2.07x faster |
| scimark_fft | 664 ms | 485 ms: 1.37x faster | 493 ms: 1.35x faster | 358 ms: 1.85x faster |
| scimark_lu | 227 ms | 159 ms: 1.43x faster | 164 ms: 1.39x faster | 132 ms: 1.72x faster |
| scimark_monte_carlo | 138 ms | 91.6 ms: 1.51x faster | 101 ms: 1.37x faster | 74.6 ms: 1.85x faster |
| scimark_sor | 256 ms | 176 ms: 1.46x faster | 195 ms: 1.31x faster | 151 ms: 1.69x faster |
| scimark_sparse_mat_mult | 8.76 ms | 6.31 ms: 1.39x faster | 6.06 ms: 1.45x faster | 5.01 ms: 1.75x faster |
| spectral_norm | 179 ms | 136 ms: 1.32x faster | 151 ms: 1.19x faster | 110 ms: 1.63x faster |
| sqlglot_normalize | 204 ms | 156 ms: 1.31x faster | 151 ms: 1.35x faster | 131 ms: 1.55x faster |
| sqlglot_optimize | 97.0 ms | 77.7 ms: 1.25x faster | 74.5 ms: 1.30x faster | 66.2 ms: 1.47x faster |
| sqlglot_parse | 2.52 ms | 1.72 ms: 1.46x faster | 1.81 ms: 1.39x faster | 1.51 ms: 1.66x faster |
| sqlglot_transpile | 3.02 ms | 2.15 ms: 1.41x faster | 2.21 ms: 1.37x faster | 1.85 ms: 1.63x faster |
| sqlite_synth | 4.08 us | 3.81 us: 1.07x faster | 3.75 us: 1.09x faster | 3.44 us: 1.18x faster |
| sympy_expand | 818 ms | 681 ms: 1.20x faster | 640 ms: 1.28x faster | 578 ms: 1.42x faster |
| sympy_integrate | 33.5 ms | 28.2 ms: 1.19x faster | 27.1 ms: 1.24x faster | 24.2 ms: 1.38x faster |
| sympy_sum | 258 ms | 222 ms: 1.16x faster | 213 ms: 1.21x faster | 199 ms: 1.29x faster |
| sympy_str | 484 ms | 405 ms: 1.20x faster | 383 ms: 1.26x faster | 344 ms: 1.41x faster |
| telco | 13.1 ms | 11.1 ms: 1.17x faster | 10.7 ms: 1.22x faster | 9.37 ms: 1.40x faster |
| tomli_loads | 3.84 sec | 2.79 sec: 1.38x faster | 2.88 sec: 1.33x faster | 2.38 sec: 1.61x faster |
| typing_runtime_protocols | 296 us | 239 us: 1.24x faster | 223 us: 1.32x faster | 193 us: 1.53x faster |
| unpack_sequence | 152 ns | 58.2 ns: 2.61x faster | 84.8 ns: 1.79x faster | 59.3 ns: 2.56x faster |
| unpickle | 26.2 us | 24.0 us: 1.09x faster | 19.8 us: 1.32x faster | 17.9 us: 1.46x faster |
| unpickle_list | 7.29 us | 6.03 us: 1.21x faster | 6.87 us: 1.06x faster | 5.38 us: 1.36x faster |
| unpickle_pure_python | 505 us | 321 us: 1.57x faster | 336 us: 1.50x faster | 257 us: 1.96x faster |
| xml_etree_parse | 232 ms | 228 ms: 1.02x faster | 200 ms: 1.16x faster | 210 ms: 1.10x faster |
| xml_etree_iterparse | 185 ms | 160 ms: 1.16x faster | 154 ms: 1.21x faster | 145 ms: 1.27x faster |
| xml_etree_generate | 181 ms | 148 ms: 1.22x faster | 135 ms: 1.35x faster | 119 ms: 1.53x faster |
| xml_etree_process | 128 ms | 100 ms: 1.28x faster | 94.4 ms: 1.36x faster | 82.0 ms: 1.56x faster |
| Geometric mean | (ref) | 1.27x faster | 1.28x faster | 1.47x faster |
Benchmark hidden because not significant (1): asyncio_tcp_ssl
More benchmarks (including clang-cl 18.1.8, 20.1.0.rc2, computed gotos and tailcall) can be found in https://github.com/proxy/gist.github.com/chris-eibl/114a42f22563956fdb5cd0335b28c7ae.
Raw data is here https://github.com/proxy/gist.github.com/chris-eibl/c73b02762a7c467e9a410a0aa19c7701.
Activity
gh-130090: Support PGO for clang-cl on Windows (GH-129907)
zooba commentedon Mar 4, 2025
This is now checked in, at least for 32-bit and 64-bit and natively-built ARM64 (cross-compiled ARM64 apparently needs some options that we don't know right now).
Thanks @chris-eibl!
chris-eibl commentedon Mar 10, 2025
@zanieb asked for build time numbers in #129907 (comment):
Numbers in the following tables represent seconds. Please note that the sum of the detailed project times does not match the
total time, because most of the projects are built in parallel, except_freeze_moduleandpython314. Therefore, I have listed them first in the details table and then sorted the others by build time of the first column, see #131005.In the pgupdate details we still see
_freeze_module, because #130420 is not on that branch. Hence, we see what that PR saves us.I intentionally branched off commit 9db1a29 to have the same environment.
Debug build times:
Release build times:
PGO build times:
pginstrphasepgoas short forpgo taskin the table)killis due tocall :Killin case ofbuild.bat --pgo- can be ignored, takes almost no timepgupdphase takes longer for MSVCbuild.bat --pgotimes are longer for MSVCVery interesting:
pyexpat_elementtreetake much longer for 20.1.0-rc2 in thepginstrphase (see details), but come back to "normal" with--flto=thin. Because these are so outliers, I retested several times with the same result :-ODetailed build times:
Detailed debug build times
Detailed release build times
Details pginstrument build times
Details pgupdate build times