使用 Clang 19 或 Xcode 16.3-16.4 构建时,计算转跳解释器的速度慢 9-13%:合并了分派跳转
作者: matthiasgoergens创建于 2026年9月27日更新于 2026年9月29日
标签type-bugperformancebuild
当 CPython 使用 Clang 19 或使用 Xcode 16.3 或 16.4 中的 Apple clang 进行构建时,计算转移解释器最终会产生一个单个共享间接跳转,而不是每个操作码一个分派跳转。每个操作码的分支预测是计算转移的关键;恢复它使 Linux 上的 pyperformance 速度提高了 8–9%,macOS arm64 上的速度提高了 11%,使用 Xcode 16.4。反过来,使用这些编译器的当前构建版本速度要慢 9–13%。LLVM 19 限制了以间接分支结尾的块的尾部复制(llvm/llvm-project#78582)。Clang 将所有计算转移降低为一个共享 indirectbr 块,并依赖于尾部复制将其复制回到每个前驱中;新的限制阻止了这一点。LLVM 20.1.0 部分修复了此问题(llvm/llvm-project#116072),20.1.1 完全修复了(llvm/llvm-project#114990)。没有 19.x 版本具有此修复。Xcode 26.0–26.3 具有部分修复;它仍然合并了大多数分派跳转,但成本仅为 1.4%。GCC 构建和尾部调用解释器(--with-tail-call-interp)不受影响。Nelson Elhage 在 2025 年 3 月发现,LLVM 19 此次回退占了 3.14 尾部调用解释器最初报告的速度提升的大部分。他关于合并分派跳转的问题,gh-129987,在 gh-132295 和 gh-132530 之后被关闭,这些问题改变了 GCC 的 SLP 向量化;Clang 19 构建仍然有一个分派跳转。
内容来源: python/cpython