高级语言条件语句效率问题

“通常为了减少时间损失,采用猜测法,即当条件转移指令从取指阶段进入执行阶段时,指令部件仍按顺序预取下一条指令。这样,如果条件不成立,转移没有发生,则没有时间损失;若条件成立,转移发生,则所取的指令必须丢掉,并再取新的指令”

上面是CPU硬件层面的行为。那么这是否能表明在高级语言如c或java里将最可能发生的事件放在if语句块里而非else语句块里是更高效的

java·c
132 views
Comments
登录后评论
Sign In
·

if else 我理解效率应该是类似的,cpu 的分支预测,两个可能都会跑,最终选一个,但是 switch 语句就不一样了。

switch 比较难做分支预测,如果性能要求比较高,switch 可以这样写:

if (condition == a) {
  // 最有可能的分支
  return ...; // 完成后跳转
}

switch(condition) {
  case b: ...
  case c: ...
}
·

我觉得你可能说的只是一种比较简单的情况,确实存在,但计算机系统结构怎么讲呢比较复杂,现代CPU也比较复杂,架构来说就不太一样,细节就更难以捉摸

你说的在C++20中有[[likely]][[unlikely]]属性,C++ attribute: likely, unlikely (since C++20) - cppreference.com

·

没必要纠结这点性能损耗。而且这个总结说得过于绝对,但编译器的优化并非完全如此。哪怕是我们用上了C++20中的[[likely]][[unlikeyly]]编译出来的汇编代码也未必会像你想的那样排列——这两个属性只是给编译器的建议,编译器可以参考它,但未必会完全照做。

·

楼上说的对,不要去纠结这点性能,正常写代码,除非出现严重性能瓶颈,真的需要榨干性能的时候再用这些 tips

·

Branchless Programming in C++ presented by Fedor Pikus at CppCon 2021 就有讨论这些,并展示如何将程序变得有更少的跳转语句,也即减少短路逻辑和分支跳转