当前位置: 首页 > 知识库问答 >
问题:

更高效的Asm与非传统的for循环?[副本]

霍建柏
2023-03-14
int main(){
    for(unsigned i = 0; i<8;)
    i++;
    return 0;
}
int main(){
    for(unsigned i = 0; i<8;i++)
    ;
    return 0;
}

因此,以非传统的方式编写for循环是否更有效?我将在两个asm中粘贴以进行比较。首先用非常规的方法:

        ;Flags[SingleProEpi] functionLength[52] RegF[0] RegI[0] H[0] frameChainReturn[UnChained] frameSize[16]

|main|  PROC
|$LN6|
        sub         sp,sp,#0x10
        mov         w8,#0
        str         w8,[sp]
|$LN2@main|
        ldr         w8,[sp]
        cmp         w8,#8
        bhs         |$LN3@main|
        ldr         w8,[sp]
        add         w8,w8,#1
        str         w8,[sp]
        b           |$LN2@main|
|$LN3@main|
        mov         w0,#0
        add         sp,sp,#0x10
        ret

        ENDP  ; |main|

和传递方式:

     ;Flags[SingleProEpi] functionLength[56] RegF[0] RegI[0] H[0] frameChainReturn[UnChained] frameSize[16]

|main|  PROC
|$LN6|
        sub         sp,sp,#0x10
        mov         w8,#0
        str         w8,[sp]
        b           |$LN4@main|
|$LN2@main|
        ldr         w8,[sp]
        add         w8,w8,#1
        str         w8,[sp]
|$LN4@main|
        ldr         w8,[sp]
        cmp         w8,#8
        bhs         |$LN3@main|
        b           |$LN2@main|
|$LN3@main|
        mov         w0,#0
        add         sp,sp,#0x10
        ret

        ENDP  ; |main|

共有1个答案

拓拔骁
2023-03-14

如果您想要优化的代码,请向您的编译器索取!检查如何优化未优化的代码是没有意义的。

-O3完全消除了循环。

编译器资源管理器演示:标准
编译器资源管理器演示:非标准

printf("%d\n", 1);
printf("%d\n", 2);
printf("%d\n", 3);
printf("%d\n", 4);
printf("%d\n", 5);
printf("%d\n", 6);
printf("%d\n", 7);
printf("%d\n", 8);
 类似资料:
  • 所以我的理解是,增强for循环应该更慢,因为它们必须使用迭代器。。然而,我的代码提供的结果参差不齐。。(是的,我知道循环逻辑占用了循环中的大部分时间) 对于较少的迭代次数(100-1000),无论有无JIT,增强的For循环似乎都要快得多。相反,对于大量迭代(100000000),传统循环速度要快得多。这是怎么回事?

  • 问题内容: 我读到 增强的for循环 比普通的 for循环 更有效: http://developer.android.com/guide/practices/performance.html#foreach 当我搜索它们的效率之间的差异时,我发现的是:如果是普通的for循环,我们需要一个额外的步骤来找出数组的长度或大小等, 但这是唯一的原因,增强的for循环优于普通的for循环吗?在那种情况下,

  • 我正在编写一个计算e^x值的方法。我在python中实现它的方式如下。 这将很好地返回e^x的值。但是,当我尝试在c#中实现相同的方法时,它没有输出与python中相同的值。以下是c#中的实现。 起初,这段代码的输出是一个无穷大符号。为了解决这个问题,我只是减少了循环运行的次数。在c#中,循环只运行10次,代码的输出非常接近于python中循环运行100次的输出。我的问题是,在不同的编程语言中,两

  • 想改进这个问题吗 通过编辑此帖子,更新问题,使其只关注一个问题。 什么是最好的 注意:我知道我可以使用: 但要做到这一点,我需要将所有变量声明为原子整数,这使得代码冗长 一定有比使用原子整数更好的方法。有?

  • 我对使用高级for循环和试图使流程清晰感到困惑。 例如,我有这样的主数据帧: 我已经有一个包含每个元素的百分比表,如下所示: 我想计算每个键的条件概率,如下所示: 我对年份栏和元素感到困惑。如何使用for循环从主数据帧的列中提取元素? 我正在考虑另一种方法,但不知道如何开始。我从百分比表中得到key1和key2,然后创建一个年份的范围(range(1983,…),然后从条件概率函数中得到prob。

  • 问题内容: 我正在编写一种简单的算法来检查整数的素数,但在将以下Java代码转换为Python时遇到问题: 因此,我一直在尝试使用此方法,但是显然我跳过了除法3: 问题答案: 从技术上讲,Python中唯一的-loop是“ for-each”,因此您可以使用类似 当然,Python可以做得更好: 也将是等效的(假设该Java循环的末尾有一个)。确实,后者将被视为采用 Python的 方式来实现。