然后阅读条件写入与写入

时间:2010-03-03 22:15:14

标签: assembly cpu low-level

平均而言,更快 - 检查值,然后根据需要分配或简单分配?或者,用C ++术语:

bool b;
if(b)
    b = false;

b = false;

假设if()条件为真,概率为50%。答案很可能是高度依赖于架构的 - 请说出您的低级别考虑因素。写入总是弄脏缓存行 - 对吧?因此,通过避免写入,我们在0.5个案例中避免了缓存刷新。但足够聪明的缓存可能会检测到一个简单的写入而不是自己的脏。但无条件写入总是一个内存操作,而读写平均是1.5个操作。

免责声明:这是一个好奇心问题,而不是我实际面临的问题。

7 个答案:

答案 0 :(得分:4)

分支在现代CPU上很昂贵,而嵌入式/旧CPU的内存访问费用很高。因此,除非你有一些奇怪的记忆需要更长的时间来阅读(提示:你没有),所以平面分配总是会更快。

由于这些原因,情况更糟:

  • 分支指令。这可能是由处理器预测的,但它仍然会产生开销的可能性。
  • 2次内存访问而不是1.大多数内存形式的读写速度都是一样的,所以为什么一次只能做两次?
  • 更多代码开销。这是一个微观的,但必须发出更多指令来执行if语句。因此意味着额外的几次内存读取和缓存中不必要地消耗的更多空间。
  • 对于悲观,这可能意味着C ++编译器决定将此变量放入寄存器而不是其他更必要的变量。
  • 另外,如果您假设b被放入注册表中。注册读/写非常便宜,但它们不是免费的..

答案 1 :(得分:1)

为了获得实际结果,在不同架构上进行分析肯定是值得的。

答案 2 :(得分:1)

这取决于各种各样的事情:

  • 分支的可预测性(在第一种情况下)
  • b是否已经在注册簿中
  • 您正在使用的架构

答案 3 :(得分:1)

除了建议配置文件外,它还真正取决于备份该写请求的内存 - 例如,如果它是内存映射的闪存设备,则写入可能非常昂贵。

答案 4 :(得分:1)

最近我一直在阅读有关非常快速压缩技术的论文,并且有人强调需要避免if分支以获得最佳性能。它的原因是CPU流水线。使用if可以破坏CPU可以并行执行部分代码的许多优化。所以,如果你有很多这样的操作,使用b = false可能会更快。

答案 5 :(得分:1)

在现代流水线处理器上,您需要考虑到这一点:

  • 错误预测的分支成本很高
  • 存储和加载需要很长时间
  • 缓存可以加速读取和写入,但如果它是多缓存架构并且在多个缓存中修改b,则多次写入可能意味着多次缓存驱逐并且可能抵消缓存的性能

使用条件写入读取至少一个内存访问和可能错误预测的分支。假设分支占50%的时间,平均有1.5次内存访问,加上错误预测的可能性。

无条件写入完全一个内存访问,没有任何分支。

现在,您需要平衡错误预测的成本与商店的成本,后者会根据您拥有的缓存代理数量而变化。

答案 6 :(得分:0)

如果您正在进行指针,参考或基本值类型的分配,我个人认为直接分配将更快(热衷于在分析器上查看结果)。在50%概率环境中,您可能会执行更多将值放入注册的指令。分配触发赋值运算符的结构或类对象将是最昂贵的。条件逻辑还引入了更多指令,并且它增加了代码复杂度指标