与0比较与与值比较比较更快吗?

时间:2019-07-12 16:46:58

标签: c assembly arm embedded

其中一个循环是否比另一个循环更快? 我一直使用#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
        }
    }

1 个答案:

答案 0 :(得分:1)

很难说。专注于发布模式的构建,它很大程度上取决于上下文,并且您不能提供所有内容,尤其是缺少循环中断条件使得无法弄清楚。

通常,如果迭代次数是立即数,则编译器会将循环构造转换为快速递减计数,直到循环内不存在循环计数器依赖项时才递减为零。

无论如何,在诸如Cortex-A系列之类的现代超标量架构上,一个简单的ALU指令(例如cmp)将被“隐藏”,因此,在大多数情况下不会花费额外的周期。

实际上更严重影响性能的是static的{​​{1}}声明,该声明自动转换为内存RW。尽可能避免这种情况。

此外,如果您只是希望counter每四次运行一次,则do something可能是更好的解决方案,可以删除计数器重置。同样,这都取决于您没有提供的上下文(“做某事”的长度)。

作为旁注,除非有充分的理由声明局部变量,否则局部变量最好是32位变量,因为任何其他少的变量都可能转换为与模数相关的其他指令,例如if ((counter & 3) == 0)uxtb等。

将循环计数器的计数减为零是不费吹灰之力的,但是,如果要获得最佳性能,还有很多事情要考虑。