gpt4 book ai didi

c++ - while(1) 对比。 for (;;) 有速度差异吗?

转载 作者:IT老高 更新时间:2023-10-28 11:30:52 25 4
gpt4 key购买 nike

长版...

一位同事今天看到我在 Perl 脚本中使用 while (1) 后断言 for (;;) 更快。我认为它们应该是相同的,希望解释器能够优化任何差异。我设置了一个脚本,它将运行 1,000,000,000 次循环迭代和相同数量的 while 循环并记录其间的时间。我找不到明显的区别。我的同事说,一位教授告诉他,while (1) 正在比较 1 == 1for (;;) 不是。我们用 100 倍的 C++ 迭代次数重复了相同的测试,差异可以忽略不计。然而,它是一个图形示例,说明编译代码与脚本语言相比要快多少。

短版...

如果您需要跳出无限循环,是否有任何理由更喜欢 while (1) 而不是 for (;;)

注意:如果从问题中不清楚。这纯粹是几个 friend 之间有趣的学术讨论。我知道这不是一个所有程序员都应该为之苦恼的 super 重要的概念。感谢所有出色的答案,我(我相信其他人)从这次讨论中学到了一些东西。

更新:上述同事在下面给出了回应。

在此引用以防被掩埋。

It came from an AMD assembly programmer. He stated that C programmers (the poeple) don't realize that their code has inefficiencies. He said today though, gcc compilers are very good, and put people like him out of business. He said for example, and told me about the while 1 vs for(;;). I use it now out of habit but gcc and especially interpreters will do the same operation (a processor jump) for both these days, since they are optimized.

最佳答案

在 perl 中,它们产生相同的操作码:

$ perl -MO=Concise -e 'for(;;) { print "foo\n" }'
a <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 2 -e:1) v ->3
9 <2> leaveloop vK/2 ->a
3 <{> enterloop(next->8 last->9 redo->4) v ->4
- <@> lineseq vK ->9
4 <;> nextstate(main 1 -e:1) v ->5
7 <@> print vK ->8
5 <0> pushmark s ->6
6 <$> const[PV "foo\n"] s ->7
8 <0> unstack v ->4
-e syntax OK

$ perl -MO=Concise -e 'while(1) { print "foo\n" }'
a <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 2 -e:1) v ->3
9 <2> leaveloop vK/2 ->a
3 <{> enterloop(next->8 last->9 redo->4) v ->4
- <@> lineseq vK ->9
4 <;> nextstate(main 1 -e:1) v ->5
7 <@> print vK ->8
5 <0> pushmark s ->6
6 <$> const[PV "foo\n"] s ->7
8 <0> unstack v ->4
-e syntax OK

在 GCC 中也是如此:

#include <stdio.h>

void t_while() {
while(1)
printf("foo\n");
}

void t_for() {
for(;;)
printf("foo\n");
}

.file "test.c"
.section .rodata
.LC0:
.string "foo"
.text
.globl t_while
.type t_while, @function
t_while:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
.L2:
movl $.LC0, %edi
call puts
jmp .L2
.LFE2:
.size t_while, .-t_while
.globl t_for
.type t_for, @function
t_for:
.LFB3:
pushq %rbp
.LCFI2:
movq %rsp, %rbp
.LCFI3:
.L5:
movl $.LC0, %edi
call puts
jmp .L5
.LFE3:
.size t_for, .-t_for
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zR"
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x1
.byte 0x3
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.LSFDE3:
.long .LEFDE3-.LASFDE3
.LASFDE3:
.long .LASFDE3-.Lframe1
.long .LFB3
.long .LFE3-.LFB3
.uleb128 0x0
.byte 0x4
.long .LCFI2-.LFB3
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI3-.LCFI2
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE3:
.ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
.section .note.GNU-stack,"",@progbits

所以我猜答案是,它们在许多编译器中是相同的。当然,对于其他一些编译器来说,情况可能不一定如此,但循环内部的代码很可能会比循环本身贵几千倍,所以谁在乎呢?

关于c++ - while(1) 对比。 for (;;) 有速度差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/885908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com