奇怪的优化?在‘libuv’中。请解释一下

libuv包含core.c:uv_run()中的下一个代码

/* The if statement lets the compiler compile it to a conditional store.
 * Avoids dirtying a cache line.
 */
if (loop->stop_flag != 0)
    loop->stop_flag = 0;

这是什么意思?这是一种优化吗?为什么他们不直接分配0?


解决方案

我认为这种优化很糟糕。例如,在带-03的GCC上,它给出了以下代码:

foo():
        movl    stop_flag(%rip), %eax
        testl   %eax, %eax
        je      .L3
        movl    $0, stop_flag(%rip)
.L3:
        ret
stop_flag:
        .zero   4

如您所见,没有条件移动,而是一个分支。我确信,分支错误预测远比弄脏高速缓存线更糟糕。

相关文章