这些循环中的一个比另一个更快吗? 我一直使用#2,认为与零进行比较比与汇编中的值进行比较更快,因为 CMP 指令执行起来更简单,但是检查一些 ARM 手册我没有看到任何东西来证实这一点。它取决于您使用的指令集和处理器吗?这是真的吗?
//#1
while(1)
{
static uint8_t counter = 0;
counter++;
if(counter == 4)
{
counter = 0;
//do something
}
}
//#2
while(1)
{
static uint8_t counter = 4;
counter--;
if(counter == 0)
{
counter = 4;
//do something
}
}
最佳答案
这很难说。专注于 Release模式构建,它在很大程度上取决于上下文,并且您并没有给出所有内容,尤其是缺少循环中断条件使得无法弄清楚。
通常,如果迭代次数是立即数,只要循环内部不存在循环计数器依赖项,编译器就会将循环构造转换为从零到一的快速倒计时。
无论如何,在 Cortex-A 系列等现代超标量架构上,cmp
等简单的 ALU 指令将被很好地“隐藏”,因此不会花费额外的周期时间。
实际上对性能影响更大的是 counter
的 static
声明,它会自动转换为内存 RW。尽可能避免这种情况。
此外,如果您只是希望做某事
每四次迭代运行一次,if ((counter & 3) == 0)
可能是更好的解决方案可以删除计数器重置。同样,这完全取决于您未提供的上下文(“做某事”的长度)。
作为旁注,局部变量最好是 32 位的,除非你有充分的理由声明它们,否则可能会转化为额外的模相关指令,例如 uxtb
、 和
等
将循环计数器递减到零很容易,但如果您想要获得最佳性能,还需要考虑更多的事情。
关于c - 与 0 进行比较与与值进行比较是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57011061/