这些循环中的一个比另一个快吗?我一直使用#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
}
}
发布于 2019-07-15 08:34:57
很难说。专注于发布模式的构建,这在很大程度上取决于上下文,而你并没有给出所有的东西,特别是缺失的循环中断条件使得它不可能弄清楚。
通常,如果迭代次数是立即值,只要循环中没有循环计数器依赖项,编译器就会将循环结构转换为快速倒计时到零。
无论如何,在像Cortex-A系列这样的现代超标量体系结构上,像cmp
这样的简单算术逻辑单元指令将被很好地“隐藏”,因此在大多数情况下不会花费额外的周期。
实际上,对性能影响更大的是counter
的static
声明,它会自动转换为内存RW。如果可能,请避免这种情况。
此外,如果您只是希望do something
每四次迭代运行一次,那么if ((counter & 3) == 0)
可能是更好的解决方案,它可以删除计数器重置。同样,这完全取决于你没有提供的上下文(“做某事”的长度)。
作为附注,局部变量最好是32位变量,除非你有充分的理由声明它们,因为任何较少的变量都可能转换为额外的模相关指令,如uxtb
、and
等。
将循环计数器倒数到零是不费吹灰之力的,但如果您想要获得最高性能,还需要考虑更多的事情。
https://stackoverflow.com/questions/57011061
复制相似问题