c - 与 0 进行比较与与值进行比较是否更快?

标签 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
        }
    }

最佳答案

这很难说。专注于 Release模式构建,它在很大程度上取决于上下文,并且您并没有给出所有内容,尤其是缺少循环中断条件使得无法弄清楚。

通常,如果迭代次数是立即数,只要循环内部不存在循环计数器依赖项,编译器就会将循环构造转换为从零到一的快速倒计时。

无论如何,在 Cortex-A 系列等现代超标量架构上,cmp 等简单的 ALU 指令将被很好地“隐藏”,因此不会花费额外的周期时间。

实际上对性能影响更大的是 counterstatic 声明,它会自动转换为内存 RW。尽可能避免这种情况。

此外,如果您只是希望做某事每四次迭代运行一次,if ((counter & 3) == 0) 可能是更好的解决方案可以删除计数器重置。同样,这完全取决于您未提供的上下文(“做某事”的长度)。

作为旁注,局部变量最好是 32 位的,除非你有充分的理由声明它们,否则可能会转化为额外的模相关指令,例如 uxtb

将循环计数器递减到零很容易,但如果您想要获得最佳性能,还需要考虑更多的事情。

关于c - 与 0 进行比较与与值进行比较是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57011061/

相关文章:

gcc - 为 ARM 交叉编译 zlib

c - C中输入的IP地址

c - 如何确定 C 与数组的互操作性

使用 AND、OR、SHR 和 SHL 指令以及数组将循环从 x86 汇编语言转换为 C 语言

visual-c++ - OMF 和 COFF 格式有什么区别?

objective-c - 反汇编简单的 ARM 指令?

c - 对 memdup 的 undefined reference

c - for 循环不会在函数内循环 - C

assembly - 在 X86 汇编程序中进行提取的最短方法?

assembly - MIPS vs Intel x86 vs LLVM是第一种要学习的汇编语言?