6

平均而言,哪个更快 - 检查值然后,如果需要,分配,还是简单地分配?或者,用 C++ 术语来说:

bool b;
if(b)
    b = false;

或者

b = false;

假设 if() 条件以 50% 的概率为真。答案很可能是高度依赖于架构的——请说出您的低级考虑。写总是弄脏缓存线——对吧?因此,通过避免写入,我们可以避免 0.5 种情况下的缓存刷新。但是一个足够聪明的缓存可能会检测到一个微不足道的写入,而不是它本身。但是无条件写入总是恰好是一次内存操作,而读写平均是 1.5 次操作。

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

4

7 回答 7

4

现代 CPU 上的分支很昂贵,而嵌入式/旧 CPU 上的内存访问也很昂贵。所以 flat just-assign 总是会更快,除非你有一些奇怪的内存,写比读需要更长的时间(提示:你没有)

由于以下原因,情况更糟:

  • 一个分支指令。处理器可能会预测到这一点,但它仍然会产生开销的可能性。
  • 2 次内存访问而不是 1 次。大多数形式的内存上的读取和写入速度是相同的,既然可以一次,为什么还要两次呢?
  • 更多的代码开销。这是一个微指令,但必须发出更多指令才能执行该if语句。这意味着额外的内存读取和缓存中不必要地消耗的更多空间。
  • 而对于悲观的人来说,这可能意味着 C++ 编译器决定将这个变量放入寄存器而不是其他更必要的变量。
  • 另外,如果您假设已将b其放入寄存器中。寄存器读/写非常便宜,但它们不是免费的..
于 2010-03-03T22:29:10.900 回答
1

绝对值得在不同的架构上对此进行分析以获得实际结果。

于 2010-03-03T22:19:54.117 回答
1

这取决于各种事情:

  • 分支的可预测性如何(在第一种情况下)
  • b 是否已经在寄存器中
  • 你正在使用什么架构
于 2010-03-03T22:20:47.470 回答
1

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

于 2010-03-03T22:25:55.477 回答
1

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

于 2010-03-03T22:26:55.323 回答
1

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

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

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

无条件写入只有一次内存访问,没有任何分支。

现在您需要平衡错误预测的成本和存储成本,这取决于您拥有多少缓存代理。

于 2010-03-03T22:30:31.773 回答
0

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

于 2010-03-03T22:26:42.137 回答