4
为什么引入无用的MOV指令会加速x86_64汇编中的紧密循环?
背景: 在使用嵌入式汇编语言优化某些Pascal代码时,我注意到一个不必要的MOV指令,并将其删除。 令我惊讶的是,删除了不必要的指令使我的程序变慢了。 我发现添加任意,无用的MOV指令可以进一步提高性能。 效果是不稳定的,并且会根据执行顺序而变化:同一行垃圾指令在一行中上下移动会导致速度降低。 我知道CPU会进行各种优化和精简,但这似乎更像是黑魔法。 数据: 我的代码版本在运行时间的循环中间有条件地编译了三个垃圾操作2**20==1048576。(周围的程序只计算SHA-256哈希值)。 我的旧机器(Intel(R)Core(TM)2 CPU 6400 @ 2.13 GHz)上的结果: avg time (ms) with -dJUNKOPS: 1822.84 ms avg time (ms) without: 1836.44 ms 程序循环运行25次,每次运行顺序随机更改。 摘抄: {$asmmode intel} procedure example_junkop_in_sha256; var s1, t2 : uint32; begin // Here are parts of the SHA-256 algorithm, in Pascal: // …