【问题标题】:Is it optimal to check a variable before setting it?在设置变量之前检查变量是否最佳?
【发布时间】:2021-04-28 02:35:26
【问题描述】:

if(foo) bar |= foo;bar |= foo; 更理想吗?

读取存储在变量中的数据是否比写入数据更快(忽略特定于硬件的限制),因此在执行某些操作之前检查它实际上是值得的吗?

【问题讨论】:

  • 为了技术上的完整,可能存在极少数情况,在这种情况下,写入bar 的成本使得事先测试foo 是值得的。如果有的话,你很可能要等到你的职业生涯多年后才会遇到这种情况。
  • 这取决于。某些情况:godbolt.org/z/dYd4qs 但通常效率较低
  • 如果内存写入需要缓存刷新可能会更有效。
  • @0___________ 我只是想感谢您向我展示了这个很棒的网站!

标签: c get bitmap set byte


【解决方案1】:

理论上:

这取决于您正在运行的处理器(比较的速度与位操作的大小)。这还取决于foo 为 0 的频率。如果从来没有,那么您将一无所获(实际上放慢了速度)

实际上:

除非您需要在压力过大的硬件上执行 1 亿次(想想实时嵌入式),否则没什么区别。

【讨论】:

  • 我正在内核上编写内存分配函数,所以我想这对我来说就是这种情况。感谢您的回答!
【解决方案2】:

if(foo) bar |= foo;bar |= foo; 更理想吗?

不,很可能更糟。您添加的if 在您编译的程序中创建了一个branch,与单个无分支指令相比会降低性能。

if(foo) bar |= foo; 中,您最多只执行 1 或 2 条指令(取决于架构):比较和分支。最坏的情况是 2 或 3 条指令(同样取决于架构):比较、分支和按位或。相反,在bar |= foo 中,您总是只执行一条指令。当然,编译器可以对代码进行一定程度的优化,但是这里使用if 基本没用。当然,在某些架构中,比较指令的成本可能低于按位或的成本,但比较和条件分支的组合几乎肯定会超过单个按位或的成本。

读取数据是否比写入更快(忽略特定于硬件的条件),因此实际上值得在对该变量执行某些特定操作之前检查它?

问题不在于真正读取或写入数据(对于该单个操作,这很可能在 CPU 寄存器中),而是执行 2/3 指令而不是 1 指令,同时还进行分支。分支进一步降低了性能,因为在使用分支预测器的现代 CPU 中,它可以(为了简单起见)导致 CPU 缓存被刷新,因此需要再次重新读取代码。见Why is processing a sorted array faster than processing an unsorted array?

只有在评估cond 加上分支的成本明显低于有条件执行statements; 的成本时,执行if (cond) { statements; } 之类的操作才有用。对于一条简单的数学指令,几乎不会出现这种情况。

【讨论】:

  • 感谢您的详细回答。我在网上只能找到“这取决于你的 cpu/ram/hd 等的速度”。在编译器/指令级别上没有任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2020-04-07
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多