对于循环执行时间不同的条件

时间:2014-08-28 08:40:47

标签: c for-loop

为什么代码:

for( i = 0, j = 0; i < 4 ,  j < 3; i++, j++)

慢于

 for( i = 0, j = 0; i < 4 &&  j < 3; i++, j++)

阐述了一些用户提出,如果一个用户需要花费更多时间而不是一个带有&amp;&amp ;;的单个if语句。 operator:我没有for循环测试它,但事实并非如此。两个if语句比一个语句快一个&amp;&amp;操作

4 个答案:

答案 0 :(得分:3)

第一个代码并不慢;至少在gcc没有优化。事实上,它应该更快

编译两个代码并进行反汇编时,您会发现第一个代码:

cmpl   $0x2,-0x8(%rbp)
jle    26 <main+0x26>

这是第二个:

cmpl   $0x3,-0x4(%rbp)
jg     44 <main+0x44>
cmpl   $0x2,-0x8(%rbp)
jle    26 <main+0x26>

在第一个示例中,gcc仅评估第二部分,因为第一部分没有效果且未在比较中使用。在第二个,它必须检查第一个,然后,如果为真,检查第二个。

因此,在一般情况下,第一个示例应该比第一个示例更快。如果你发现第一个比较慢,也许你测量它的方法不是100%正确。

答案 1 :(得分:1)

他们的可能没有执行时间的变化,但可能非常多的迭代次数,因为:

如果我们在for循环中放入逗号分隔条件,它会计算最后一个的值。所以基本上你先写的条件,它将被忽略,第二个将被检查。因此j = 0; i < 4将始终检查i<4 i < 4 && j < 3将检查的位置,当且仅当两个条件均为true时才返回true。

Reference

答案 2 :(得分:0)

如果我们检查您所拥有的代码的汇编,您可能会看到差异

<强>程序

int main()
{
    int x,y;
    for(x=0,y=0;x<4,y<5;x++,y++);

    printf("New one");

    for(x=0,y=0;x<4 && y<5;x++,y++);

}

获取程序集的命令:gcc -S <program name>

<强>装配

          .file   "for1.c"
    .section    .rodata
.LC0:
    .string "New one"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $32, %esp
    movl    $0, 24(%esp)
    movl    $0, 28(%esp)
    jmp .L2
.L3:
    addl    $1, 24(%esp)
    addl    $1, 28(%esp)
.L2:
    cmpl    $4, 28(%esp) //Here only one condition
    jle .L3
    movl    $.LC0, (%esp)
    call    printf
    movl    $0, 24(%esp)
    movl    $0, 28(%esp)
    jmp .L4
.L6:
    addl    $1, 24(%esp)
    addl    $1, 28(%esp)
.L4:
    cmpl    $3, 24(%esp) //First Condition
    jg  .L7
    cmpl    $4, 28(%esp) //Second Condition
    jle .L6
.L7:
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section    .note.GNU-stack,"",@progbits

所以,很明显,如果我们有2个条件,那么它将花费更多的时间。

答案 3 :(得分:-1)

第一个选项是两个ifs, 第二个选项是一个数学方程式,如果通常更快,则选择一个 在这里,如果通过计算,您可以节省一个,这样可以节省更少的处理时间。

第一个选项 - &gt; if()&amp;&amp; if(),

第二选项 - &gt; if(()&amp;&amp;())