【发布时间】:2010-12-09 19:42:46
【问题描述】:
有时,CPU 花费大部分时间的循环经常会出现一些分支预测未命中(错误预测)(概率接近 0.5)。我在非常孤立的线程上看到了一些技术,但从未见过列表。我知道的那些已经修复了条件可以转换为布尔值并且 0/1 以某种方式用于更改的情况。还有其他可以避免的条件分支吗?
例如(伪代码)
loop () {
if (in[i] < C )
out[o++] = in[i++]
...
}
可以重写,可能会失去一些可读性,如下所示:
loop() {
out[o] = in[i] // copy anyway, just don't increment
inc = in[i] < C // increment counters? (0 or 1)
o += inc
i += inc
}
我还看到,在某些情况下,我现在在某些情况下,在条件条件下将&& 更改为&。我是这个优化级别的新手,但感觉肯定还有更多。
【问题讨论】:
-
不好的例子。即使无分支代码可以被视为等同于原始代码,那也只是在原始代码一开始就没有任何意义的情况下。
-
为什么这么多人回答的答案实际上并没有回答这个问题,这超出了我的理解
标签: c optimization assembly