当我在平常的一天编程时,我会确保所有的分支很可能不会被采用。
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/