平均而言,更快 - 检查值,然后根据需要分配或简单分配?或者,用C ++术语:
bool b;
if(b)
b = false;
或
b = false;
假设if()条件为真,概率为50%。答案很可能是高度依赖于架构的 - 请说出您的低级别考虑因素。写入总是弄脏缓存行 - 对吧?因此,通过避免写入,我们在0.5个案例中避免了缓存刷新。但足够聪明的缓存可能会检测到一个简单的写入而不是自己的脏。但无条件写入总是一个内存操作,而读写平均是1.5个操作。
免责声明:这是一个好奇心问题,而不是我实际面临的问题。
答案 0 :(得分:4)
分支在现代CPU上很昂贵,而嵌入式/旧CPU的内存访问费用很高。因此,除非你有一些奇怪的记忆需要更长的时间来阅读(提示:你没有),所以平面分配总是会更快。
由于这些原因,情况更糟:
if
语句。因此意味着额外的几次内存读取和缓存中不必要地消耗的更多空间。 b
被放入注册表中。注册读/写非常便宜,但它们不是免费的.. 答案 1 :(得分:1)
为了获得实际结果,在不同架构上进行分析肯定是值得的。
答案 2 :(得分:1)
这取决于各种各样的事情:
答案 3 :(得分:1)
除了建议配置文件外,它还真正取决于备份该写请求的内存 - 例如,如果它是内存映射的闪存设备,则写入可能非常昂贵。
答案 4 :(得分:1)
最近我一直在阅读有关非常快速压缩技术的论文,并且有人强调需要避免if
分支以获得最佳性能。它的原因是CPU流水线。使用if
可以破坏CPU可以并行执行部分代码的许多优化。所以,如果你有很多这样的操作,使用b = false
可能会更快。
答案 5 :(得分:1)
在现代流水线处理器上,您需要考虑到这一点:
b
,则多次写入可能意味着多次缓存驱逐并且可能抵消缓存的性能使用条件写入读取至少一个内存访问和可能错误预测的分支。假设分支占50%的时间,平均有1.5次内存访问,加上错误预测的可能性。
无条件写入完全一个内存访问,没有任何分支。
现在,您需要平衡错误预测的成本与商店的成本,后者会根据您拥有的缓存代理数量而变化。
答案 6 :(得分:0)
如果您正在进行指针,参考或基本值类型的分配,我个人认为直接分配将更快(热衷于在分析器上查看结果)。在50%概率环境中,您可能会执行更多将值放入注册的指令。分配触发赋值运算符的结构或类对象将是最昂贵的。条件逻辑还引入了更多指令,并且它增加了代码复杂度指标