assembly - 先读后条件写 vs. 写

标签 assembly cpu low-level

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

bool b;
if(b)
    b = false;

或者
b = false;

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

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

最佳答案

分支在现代 CPU 上很昂贵,而在嵌入式/较旧的 CPU 上内存访问很昂贵。因此,除非您有一些奇怪的内存,写入时间比读取时间长(提示:您没有)

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

  • 分支指令。这可能会被处理器预测到,但它仍然会产生开销的可能性。
  • 2 次内存访问而不是 1 次。在大多数形式的内存上读取和写入的速度相同,那么为什么一次可以做两次呢?
  • 更多的代码开销。这是一个微指令,但必须发出更多指令才能执行 if陈述。这意味着额外的内存读取和缓存中不必要地消耗的更多空间。
  • 悲观地说,这可能意味着 C++ 编译器决定将此变量放入寄存器而不是其他更必要的变量中。
  • 另外,如果您假设 b被放入寄存器。寄存器读/写非常便宜,但它们不是免费的..
  • 关于assembly - 先读后条件写 vs. 写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375425/

    相关文章:

    assembly - 代码注入(inject)的 EXC_BAD_INSTRUCTION (armv7 asm)

    c - 汇编中的 Malloc 和 strdup(自行实现)

    architecture - (Nand2tetris CPU)每个时钟周期发生(什么/多少)?

    cpu - 硬件中大整数乘法器的权衡

    assembly - sbb指令和进位标志的使用

    c - 用Visual C++编译器解释空C `main`函数奇怪的汇编

    compiler-construction - 与动态调度相比,编译器指令调度有什么优势?

    windows - TIB 定制存储

    c# - C#数组如何处理内存?

    c - 3D数组如何存储在C中?