0Pricing
C++ Academy · 课时

分支预测与热点循环

帮助 CPU 预测分支,并编写编译器可以优化的循环

分支预测与热点循环 是 CoddyKit 上的免费 C++ Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C++ Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C++ Academy 课程共包含 4 节课。

分支预测器

现代 CPU 会在上一条指令完成之前预测下一条指令。当预测错误时,流水线会停顿,代价为 10–20 个周期。

可预测的分支

几乎总是朝同一方向执行(或遵循清晰模式)的分支很容易被正确预测。随机分支则会严重影响性能。

排序数据有帮助

对排序后的数据执行带条件的遍历,通常比对未排序数据执行更快——预测器会学会这种模式。

// Often much faster on sorted data
std::sort(v.begin(), v.end());
int sum = 0;
for (int x : v) {
    if (x > 128) sum += x;
}

无分支代码

在可能的情况下,用算术运算替代分支。CPU 会计算两条路径,然后在不进行分支的情况下选择结果。

// Branchy
int max(int a, int b) { return (a > b) ? a : b; }

// Branchless (often equivalent in machine code)
int max(int a, int b) { return a + (b - a) * (b > a); }

std::max 是更好的选择

现代编译器通常会自动生成无分支代码。只需编写清晰的代码,让优化器发挥作用——但在热点路径上应检查反汇编结果。

likely 与 unlikely 提示

C++20 增加了 [[likely]] 和 [[unlikely]],用于向编译器提供提示。

if (error_condition) [[unlikely]] {
    handle_error();
}

循环展开

每次迭代执行更多工作,可以降低分支频率。现代编译器会自行展开循环;只有在测量确认有帮助时,才使用 #pragma unroll。

避免在循环中混合工作负载

包含两种随机交替情况的循环会破坏预测。在可能的情况下,将其拆分为两个循环(每种情况一个)。

// Slow: random switching
for (auto& x : v) {
    if (x.type == A) process_A(x);
    else            process_B(x);
}

// Faster: partition first
std::partition(v.begin(), v.end(), [](auto& x) { return x.type == A; });
for (size_t i = 0; i < boundary; ++i) process_A(v[i]);
for (size_t i = boundary; i < v.size(); ++i) process_B(v[i]);

内联热点函数

在热点循环中,函数调用的开销可能与函数体本身相当。inline 提示会有所帮助;__attribute__((always_inline))(GCC/Clang)则更加严格。

不要相信直觉

编译器和 CPU 都非常聪明。请在优化前进行测量。预测器经过训练后,那个“显而易见”的无分支版本可能反而比包含分支的版本更慢。

使用 SIMD 扩展循环

在条件允许时,自动向量化会将循环转换为 SIMD 指令。请编写简洁的代码,使用简单类型,并避免迭代之间存在数据依赖。

基于性能分析数据的优化(PGO)

先编译、运行并收集性能分析数据,再根据提示重新编译。编译器会利用这些数据,更好地预测哪些分支属于热点。

快速检查

为什么在过滤循环之前对数据排序,有时会加快执行速度?

回顾

错误预测的分支会消耗周期。让分支保持可预测(排序数据会有所帮助),使用 likely/unlikely 提示,将工作负载分区以保持循环的一致性;除非性能分析证明需要,否则应相信编译器会进行优化。

常见问题解答

「分支预测与热点循环」课时是免费的吗?

是的 — 「分支预测与热点循环」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C++ Academy 课程的其余内容,请升级到 CoddyKit PRO。 C++ Academy 课程共包含 4 节课。

「分支预测与热点循环」这节课中我会学到什么?

帮助 CPU 预测分支,并编写编译器可以优化的循环 你通过在浏览器中直接运行的动手代码来练习 C++ Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C++ Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C++ Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「分支预测与热点循环」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C++ Academy 课中编写并运行代码吗?

能。每节 C++ Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 缓存友好的数据布局
  2. 分支预测与热点循环
  3. 使用 perf、vtune 和 Sanitizer 进行性能分析
  4. 使用 Google Benchmark 进行微基准测试
← 返回 C++ Academy