【发布时间】:2016-12-03 20:44:58
【问题描述】:
为什么要使用:
MOV EAX, 22
SHL EAX, 2
...当乘以 4 而不是仅使用 MUL 指令时?
我知道这也可以用SHR 而不是DIV 来完成。
这样做有什么好处?
你也可以用奇数来做这个,还是只能是偶数?
【问题讨论】:
-
想想以 10 为底,左/右移动乘以 10 的幂比进行真正的乘法要快得多(而且没有人这样做)。同样的事情也适用于在任何基础上乘以基础的幂
-
要详细了解 asm 中的快速特性,请参阅 x86 tag wiki,尤其是 Agner Fog's guides。另请参阅this answer I wrote,了解 shift 和 LEA 与 DIV 相比究竟有多快。现代 Intel CPU 具有极高的性能乘法硬件(例如 3 周期延迟,每 1c 吞吐量一个
imul r64, r64),但即时移位甚至更快(1c 延迟,每时钟 tput 两个)。 -
为什么“Pentium Pro”在这个问题中发挥了重要作用? a)问题主体中未提及,b)它们早已过时,c)答案相对稳定且对现代架构有用。从问题标题中删除?