我想知道当移位2的幂时,执行逻辑右移是否更快
例如,是
myUnsigned >> 4
比
更快myUnsigned >> 3
我很欣赏每个人的第一反应是告诉我,人们不应该担心像这样的小事,它使用正确的算法和集合来减少重要的数量级。我完全同意你的意见,但我真的想从嵌入式芯片(ATMega328)中挤出所有东西 - 我只是有一个值得'哇哇'的性能转变!通过用位移替换除法,所以我向你保证这很重要。
答案 0 :(得分:18)
让我们看一下数据表:
http://atmel.com/dyn/resources/prod_documents/8271S.pdf
据我所知,ASR(算术右移)总是移位一位,不能取位移位;执行需要一个周期。因此,向右移位n位将需要n个周期。两个人的行为与任何其他数字相同。
答案 1 :(得分:4)
您必须查阅处理器的文档以获取此信息。即使对于给定的指令集,取决于模型也可能有不同的成本。例如,在一个非常小的处理器上,换一个可能比其他值更快(某些IA32处理器上的旋转指令就是这种情况,但这只是因为这个指令很少由编译器产生)。
根据http://atmel.com/dyn/resources/prod_documents/8271S.pdf,所有逻辑转换都在ATMega328的一个周期内完成。但是,正如评论中指出的那样,所有逻辑转变都是一点点。因此,在n
说明中,n
的转换成本为n
个周期。
答案 2 :(得分:4)
在AVR instruction set中,算术右移和左移一次发生一位。因此,对于这个特定的微控制器,移位>> n
意味着编译器实际上产生了许多单独的asr
操作,我猜>>3
比>>4
更快。
顺便说一句,这使得AVR相当不正常。
答案 3 :(得分:2)
这取决于处理器的构建方式。如果处理器具有桶形旋转,则它可以在一次操作中移位任意数量的位,但这需要芯片空间和功率预算。最经济的硬件只能旋转一个,有关环绕钻头的选项。接下来是可以向左或向右旋转一个。我可以想象一个具有1个移位器,2个移位器,4个移位器等的结构,在这种情况下,4可能比3更快。
答案 4 :(得分:2)
首先反汇编然后再编码。人们告诉你不要气馁,你在浪费你的时间。你获得的知识将使你成为公司解雇大公司的转折人。拥有真正幕后知识的人数在这个行业中以惊人的速度下降。
听起来像其他人在这里解释了真正的答案,反汇编会显示,单位移位指令。因此,4班次需要133%的时间,3班次,或3班次是4班次的75%,取决于你如何比较数字。并且你的测量应该反映出这种差异,如果他们不继续这个实验,直到你完全理解执行时间。
答案 5 :(得分:2)
事实上,ATMega没有大多数其他8位MCU那样的桶形移位器。因此,它每次只能移动1而不是像强大的CPU那样的任意值。结果,移位4理论上比移位3
慢然而,ATMega 确实有swap nibble instruction ,所以 x >> 4
实际上比x >> 3
更快
假设x
是uint8_t
,则x >>= 3
由 3次右移
x >>= 1;
x >>= 1;
x >>= 1;
而x >>= 4
只需要交换且有点清楚
swap(x); // swap the top and bottom nibbles AB <-> BA
x &= 0x0f;
或
x &= 0xf0;
swap(x);
对于更大的交叉寄存器移位,还有各种方法来优化它
uint16_t
变量y
由低部分y0
和高部分y1
组成,y >> 8
只是
y0 = y1;
y1 = 0;
同样y >> 9
可以优化为
y0 = y1 >> 1;
y1 = 0;
总之,移位时间取决于移位距离,但对于更长或非幂2值来说不一定更慢。通常,最多需要3条指令才能在8位字符内移位
以下是some demos from compiler explorer
通过上面的swap
和and
来实现4的右移
swap r24
andi r24,lo8(15)
右移3必须用3条指令
完成lsr r24
lsr r24
lsr r24
Left shifts也以相同的方式进行优化
答案 6 :(得分:1)
如果您的targer处理器有一个位移指令(这很可能),那么它取决于该指令的硬件实现,如果在移位2位幂或移位某些位之间会有任何差异其他号码。但是,它不太可能有所作为。
答案 7 :(得分:0)
尽管如此,在开始测量之前,你甚至不应该开始谈论性能。用分区编译你的程序。跑。测量时间。转移重复。
答案 8 :(得分:0)
用移位代替除法
这与负数不同:
char div2 (void)
{
return (-1) / 2;
// ldi r24,0
}
char asr1 (void)
{
return (-1) >> 1;
// ldi r24,-1
}