c - for循环迭代是否等同于分支?

标签 c branch-prediction

当我在平常的一天编程时,我会确保所有的分支很可能不会被采用。

int retval = do_somting();
if(!retval) { /* Less-than-likely event*/ }

这个乐观主义者分支预测,导致 CPU 的预测位设置为“不接受”。然而,预测位是否会在 for 循环后被迫返回“take”?

// prediction = "likely take"
if(false) { }

// prediction = "probably take"
if(false) { }

// prediction = "probably not take"
if(false) { }

// prediction = "likely not take"
if(false) { }

/* ... thousands of other if(false) that are speedy-fast */

for(int i = 0; i < 5; i++) { }
// prediction = "likely take"?

我知道这是一个不切实际的微不足道的优化,但是嘿,你知道的越多。

编辑:让我们假设 GCC 不会破坏上面的所有代码,我们也只讨论 amd64 架构。因为我没有意识到这个问题有多低级。

最佳答案

事实证明,分支预测取决于 CPU 的型号。

根据 this paper ,当将循环与正常分支相关联时,分支预测以无数种方式处理。一些 CPU 有一个单独的预测器循环。所以这意味着 if 语句根本不会影响 for 语句的预测。其他人也有相同的预测。

无论如何,这个问题没有唯一的正确答案。谈分支效率时,for循环是不可衡量的。

...当然,除非您打算只在单一型号的 CPU 上运行您的程序。

关于c - for循环迭代是否等同于分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41877720/

相关文章:

assembly - 多态的代价

c++ - 尝试使用 tcc 针对 gcc 生成的 .o 文件编译源代码时出现奇怪的行为

C++:在 C 或 C++ 中以普通文本模式(非二进制)写入 vector 文件以输出最快

C 位操作逻辑(bitAnd)

条件码---CF和OF

c++ - C/C++ 最有效的 if 语句评估

在源代码中创建字符串数组在可执行文件中不起作用

c++ - C/C++ : is using the result of comparison as int really branchless?

assembly - 如何动态地将分支目标提示到 x64 CPU?

assembly - 分支预测会使我的程序崩溃吗?