为什么代码:
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;操作
答案 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。
答案 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;())