其中一个循环是否比另一个循环更快? 我一直使用#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
}
}
答案 0 :(得分:1)
很难说。专注于发布模式的构建,它很大程度上取决于上下文,并且您不能提供所有内容,尤其是缺少循环中断条件使得无法弄清楚。
通常,如果迭代次数是立即数,则编译器会将循环构造转换为快速递减计数,直到循环内不存在循环计数器依赖项时才递减为零。
无论如何,在诸如Cortex-A系列之类的现代超标量架构上,一个简单的ALU指令(例如cmp
)将被“隐藏”,因此,在大多数情况下不会花费额外的周期。
实际上更严重影响性能的是static
的{{1}}声明,该声明自动转换为内存RW。尽可能避免这种情况。
此外,如果您只是希望counter
每四次运行一次,则do something
可能是更好的解决方案,可以删除计数器重置。同样,这都取决于您没有提供的上下文(“做某事”的长度)。
作为旁注,除非有充分的理由声明局部变量,否则局部变量最好是32位变量,因为任何其他少的变量都可能转换为与模数相关的其他指令,例如if ((counter & 3) == 0)
,uxtb
等。
将循环计数器的计数减为零是不费吹灰之力的,但是,如果要获得最佳性能,还有很多事情要考虑。