Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 逻辑/算术移位是否更少位更快?_C++_Performance_Assembly_X86_Cpu Architecture - Fatal编程技术网

C++ 逻辑/算术移位是否更少位更快?

C++ 逻辑/算术移位是否更少位更快?,c++,performance,assembly,x86,cpu-architecture,C++,Performance,Assembly,X86,Cpu Architecture,x>>2比x>>31快吗? 换句话说,sar x,2比sar x,31快吗? 我做了一些简单的测试,他们似乎有相同的速度。如果有确凿的证据,我将不胜感激。这将取决于硬件实现。对于涉及常量移位的常见操作(例如指针算术),可能有更快的路径(例如,可能与相关加法操作融合)。对于变量移位,使用电路,其中任何移位量都具有相同的延迟。此问题的答案可能取决于所针对的特定体系结构。你应该用你要问的架构来标记这个问题。例如,x86。您正在研究微优化。节省的时间可以是纳秒,也可以是100纳秒。问问自己这是否有意义。

x>>2
x>>31
快吗? 换句话说,
sar x,2
sar x,31
快吗?
我做了一些简单的测试,他们似乎有相同的速度。如果有确凿的证据,我将不胜感激。

这将取决于硬件实现。对于涉及常量移位的常见操作(例如指针算术),可能有更快的路径(例如,可能与相关加法操作融合)。对于变量移位,使用电路,其中任何移位量都具有相同的延迟。

此问题的答案可能取决于所针对的特定体系结构。你应该用你要问的架构来标记这个问题。例如,
x86
。您正在研究微优化。节省的时间可以是纳秒,也可以是100纳秒。问问自己这是否有意义。我记得8086每移位一位都需要时间,186也需要时间。186个掩码移位计数为31,以限制处理单个指令的持续时间。x>>31在一些古老的处理器上可能更快,因为它只需检查一位。例如,使用进位向左移动;将寄存器设置为0;用借来减去。x> 在一些古老的处理器上,>31可能会慢一些,因为它必须右移1位,31个独立的时间。@MarkRansom:记住,8051及其同类处理器仍然在使用中。:-)可能有一些定制的微型机。我不能说所有的微型机都有桶形移位器-(并且有实际x86 CPU指令的数字。众所周知,奔腾4的移位速度很慢,但仍然固定了延迟/吞吐量(不依赖于数据)。大多数CPU的任何移位计数都有1个周期的延迟。(在现代英特尔CPU上,编译时常量偏移非常大,但当计数是一个运行时变量时,
shr reg,cl
解码为3 uops。除非让编译器使用BMI2
shlx
/
shrx
。但是,延迟只有1个周期。)英特尔早在386SX就有一个桶形移位器:将寄存器移位/旋转的周期计数列为按1移位、按CL移位或按立即数移位的3个周期。(与像
add reg、reg
这样的指令的2个周期相比)。上一个具有取决于计数的移位性能的英特尔x86似乎是286:有一个8088的表。奔腾。8088是8+4n,186和286是5+n。386是固定的3个周期。