(1) 대. for (;;) 속도 차이가 있습니까?


154

긴 버전 ...

동료는 오늘 while (1)Perl 스크립트에서 for (;;)더 빠른 사용을보고 나서 주장했다 . 나는 그들이 통역사가 어떤 차이를 최적화하길 바라고 같은 것이되어야한다고 주장했다. 루프 반복 및 동일한 수의 while 루프에 대해 1,000,000,000을 실행하고 그 사이의 시간을 기록하는 스크립트를 설정했습니다. 나는 눈에 띄는 차이를 찾을 수 없었다. 저의 동료는 교수가 그에게 while (1)비교를 1 == 1하고 있지만 for (;;)그렇지 않다고 그에게 말했습니다 . 우리는 C ++로 반복 횟수를 100 배로 동일한 테스트를 반복했으며 그 차이는 무시할 만했습니다. 그러나 컴파일 된 코드가 스크립팅 언어에 비해 얼마나 빠른지를 보여주는 그래픽 예입니다.

짧은 버전 ...

탈출하기 위해 무한 루프가 필요한 경우 while (1)오버 오버 를 선호하는 이유 for (;;)가 있습니까?

참고 : 질문에서 명확하지 않은 경우. 이것은 순전히 두 친구 사이의 재미있는 학술 토론이었습니다. 나는 이것이 모든 프로그래머가 고민해야 할 매우 중요한 개념이 아니라는 것을 알고 있습니다. 이 토론에서 몇 가지를 배웠습니다.

업데이트 : 위에서 언급 한 동료의 무게는 다음과 같습니다.

그것이 묻힐 경우를 대비하여 여기에 인용하십시오.

AMD 어셈블리 프로그래머가 제공 한 것입니다. 그는 C 프로그래머들 (사람들)은 그들의 코드가 비효율적이라는 것을 깨닫지 못한다고 말했다. 그는 오늘 gcc 컴파일러는 매우 훌륭하며 그와 같은 사람들을 사업에서 제외 시켰다고 말했다. 그는 예를 while 1들어서 vs 에 대해 이야기했습니다 for(;;). 지금은 습관이 없지만 gcc 및 특히 통역사는 최적화되어 있기 때문에 요즘 두 가지 모두 동일한 작업 (프로세서 점프)을 수행합니다.


4
궁금해. 펄 스크립트에 무한 루프가 필요한 이유는 무엇입니까? 당신은 분명히 드라이버 나 시스템을 프로그래밍하고 있지 않다 ... Infinite is quiet long :-)
— Luc M

125
어떤 무한 루프가 가장 빠릅니까? LOL ... "내 새 컴퓨터는 너무 빨리, 그것은 시간에서 그냥 무한 루프가 실행됩니다 ...";-)
— Arjan Einbu

8
저것은 그에게 사회학 교수였습니까? 현대에는 입력 한 코드가 컴퓨터가 보는 것이 아닙니다.
— brian d foy

5
테스트하는 데 걸리는 시간이 어느 쪽이 더 빠른지 알면 잠재적으로 절약되는 시간보다 훨씬 오래 걸릴 것으로 예상합니다. 평생 프로그래밍을 통해 그것을 상각하더라도.
— Peter Recore

4
컴파일러가 부작용이없고 컴파일러가 이미 알고있는 테스트를 수행하기 위해 코드를 생성하는 이유는 무엇입니까? 말이되지 않습니다.
— David Schwartz

답변:


218

펄에서는 동일한 opcode가 발생합니다.

$ 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

그래서 대답은 많은 컴파일러에서 동일하다는 것입니다. 물론 다른 컴파일러의 경우 반드시 그런 것은 아니지만 루프 내부의 코드가 루프 자체보다 수천 배 비싸 질 가능성이 있습니다.


15
B :: Deparse를 사용해보십시오. 무한 for 루프를 파싱하면 while 루프가 반환됩니다. : P
— Kent Fredric

27
"펄에서, 그들은 동일한 opcodes를 초래한다"... 그렇습니다, 그러나 어느 것이 더 빠릅니까? :-)
— Tin Man

6
나는 gcc가 printf () 대신 puts ()를 대체 한 것을 좋아한다. 왜냐하면 단 하나의 인수 만 있기 때문에 더 빠르고 안전하게 포맷팅 할 것이 없기 때문이다! (gcc는 변수 인수 목록과 비교하여 서식 태그를 확인합니다.)
— Lee D

@the 틴 남자 : 그들이있는 거 상응하는 컴퓨터가 않기 때문에 똑같은 작업 : P
— BlackBear

1
@snap, 그것은 '완전히'부정확하지 않고 단지 런타임 비용에 초점을 맞추고 있습니다. 무한 루프 의 파싱 ​​시간 으로 인해 프로그램 실행 속도를 결정하는 주요 요인이되는 상황을 상상할 수 없습니다.
— bdonlan

55

GCC를 사용하면 둘 다 동일한 어셈블리 언어로 컴파일되는 것처럼 보입니다.

L2:
        jmp     L2

20
-S 옵션과 함께 GCC 사용 (조립, 연결 안 함)
— Martin Cote

54

다른 것을 선호하는 이유는별로 없습니다. 나는 보다 읽기 쉽고 while(1)특히 while(true)더 읽기 쉽다고 생각 for(;;)하지만 그것은 단지 내 취향입니다.


94
#define EVER ;; 나는 항상 그런 종류의 재미를 발견했습니다.
— Tom

19
영원히 #define ever ;;;
— Martin Cote

16
둘 다 표면에서 더 읽기 쉬워 보이지만 유지 보수 프로그래머 (보통 나)가 머리를 긁기 위해 새 키워드를 정의하지 않습니다.
— Bill the Lizard

13
#define은 토큰 내에서 대체되지 않으며 forever자체 토큰 이기 때문에 작동하지 않습니다 .
— Lily Chung

2
"내 유지 보수를 위해 새 키워드를 정의하지 않습니다."– 더 많은 사람들 만이 그러한 태도를 취했다면, 돌아올 때마다이 모든 미치광이 마법의 허니 건을 움켜 쥐지 않을 것입니다!
— tchrist

31

표준에 따라 차이가 없습니다. 6.5.3 / 1의 기능 :

for 문

for ( for-init-statement ; conditionopt ; expressionopt ) statement

에 해당

{
  for-init-statement
  while ( condition ) {
    statement
    expression ;
  }
}

그리고 6.5.3 / 2에는 다음이 있습니다.

조건과 표현식 중 하나 또는 둘 다를 생략 할 수 있습니다. 누락 된 조건은 암시적인 while 절을 while (true)와 동일하게 만듭니다.

따라서 C ++ 표준에 따르면 코드는 다음과 같습니다.

for (;;);

정확히 다음과 같습니다.

{
  while (true) {
    ;
    ;
  }
}

4
그것은 생성 된 코드 나 성능과 전혀 관련이 없습니다. 표준은 기능 만 정의합니다. 물론 성능은 같습니다.
— Potatoswatter

1
성능의 차이가 as-if 규칙을 위반한다는 것이 사실이라고는 생각하지 않습니다. 만약 그렇다면, 컴파일러는 독립적 인 문장의 순서를 바꾸는 것과 같이 as-if 규칙 하에서 코드 속도를 높일 수 없습니다. 실제로 컴파일러는 정확히 그렇게합니다. 그러나 표준의 사본은 위층에 있습니다.
— Steve Jessop

28

에 대한 경고를 발생시키는 데 사용되는 Visual C ++ 컴파일러

while (1) 

(일정한 표현)

for (;;)

나는 for (;;)그 이유 를 선호하는 관행을 계속 했지만 컴파일러가 여전히 그렇게하는지 모르겠습니다.


대신 동안 (사실)의 (1) 동안 사용 becuase 경고는 아마
— jrharshath

16
참은 상수입니다. (true)는 상수 식입니다. 관심있는 사람은 C4127 경고가 여기에 문서화되어 있습니다. msdn.microsoft.com/en-us/library/6t66728h(VS.80).aspx
— sean e

예, 경고는 여전히 1과 true 모두에 존재합니다. 그것이 내가 항상 (;;)에 사용하는 이유입니다.
— Elviss Strazdins

26

for(;;) 당신이 물건을 최적화하기 위해 그 방향으로 가고 싶다면 입력 할 문자가 적습니다.


21
골프에 대해 잘 알고 있습니다. 그렇지 않으면 구문을 선택해야하는 나쁜 이유가 있습니다.
— Adam Bellaire

@AdamBellaire Terseness는 종종 특정 기술 임계 값 이상으로 가독성을 높입니다.
— 벡터 Gorgoth

20

이 오래된 컴파일러를 사용하는 Turbo C for(;;)는 더 빠른 코드를 생성 while(1)합니다.

오늘날 gcc, Visual C (거의 모든 것) 컴파일러는 잘 최적화되며 4.7 MHz의 CPU는 거의 사용되지 않습니다.

당시에는 a for( i=10; i; i-- )가보다 빠릅니다. for( i=1; i <=10; i++ )비교 i가 0 이기 때문에 CPU- 제로-플래그 조건부 점프가 발생합니다. 그리고 Zero-Flag는 마지막 감소 작업으로 수정되었으며 ( i-- )추가 cmp 작업이 필요하지 않습니다.

    call    __printf_chk
    decl    %ebx          %ebx=iterator i 
    jnz     .L2
    movl    -4(%ebp), %ebx
    leave

여기에 for(i=1; i<=10; i++)여분의 cmpl이 있습니다.

    call    __printf_chk
    incl    %ebx
    cmpl    $11, %ebx
    jne     .L2
    movl    -4(%ebp), %ebx
    leave

13

주장하는 모든 사람들에게 당신은 undefinte while 루프를 사용해서는 안되며 open goto (진지하게 ouch)를 사용하는 것과 같은 멍청한 물건을 제안해서는 안됩니다

while (1) {
     last if( condition1 );
     code();
     more_code(); 
     last if( condition2 ); 
     even_more_code(); 
}

실제로 다른 방법으로는 효과적으로 표현 될 수 없습니다. 종료 변수를 만들고 동기화를 유지하기 위해 흑 마법을 사용하지 않는 한 아닙니다.

보다 복잡한 구문을 사용하려는 경우 범위를 제한하는 제정신을 사용하십시오.

flow: { 

   if ( condition ){ 
      redo flow;
   }
   if ( othercondition ){ 
       redo flow;
   }
   if ( earlyexit ){ 
       last flow;
   }
   something(); # doesn't execute when earlyexit is true 
}

궁극적으로 속도는 그렇게 중요하지 않습니다

현명하게 다른 루핑 구조물이 얼마나 효과적인지 걱정하는 것은 엄청난 시간 낭비입니다. 통과하는 조기 최적화. 프로파일 링 코드가 루핑 구조를 선택할 때 병목 현상이 발견되는 상황을 전혀 생각할 수 없습니다.

일반적으로 그것 방법 루프와는 어떤 루프.

가독성과 간결성을 위해 "최적화"하고, 코드를 찾는 다음 빈약 한 빨판에게 문제를 설명하는 데 가장 적합한 것을 작성해야합니다.

누군가가 언급 한 "goto LABEL"트릭을 사용하고 코드를 사용해야하는 경우 특히 눈을 뜨고 잠을 잘 수 있도록 준비하십시오. 특히 두 번 이상 사용하는 경우 이러한 종류의 물건이 끔찍하게 스파게티 코드를 생성하기 때문입니다 .

당신은 그냥 있기 때문에 할 수 스파게티를 만드는 코드가 당신에게 의미하지 않는다 해야


9

Stroustrup, TC ++ PL (3 판), §6.1.1에서 :

호기심 표기법 for (;;)은 무한 루프를 지정하는 표준 방법입니다. "영원히"발음 할 수 있습니다. [...] while (true)는 대안입니다.

나는 선호한다 for (;;).


9

컴파일러가 최적화를 수행하지 않으면 for(;;)항상보다 빠릅니다 while(true). while 문은 매번 조건을 평가하지만 for 문은 무조건 점프하기 때문입니다. 그러나 컴파일러가 제어 흐름을 최적화하면 일부 opcode가 생성 될 수 있습니다. 디스 어셈블리 코드를 매우 쉽게 읽을 수 있습니다.

추신 : 당신은 다음과 같이 무한 루프를 작성할 수 있습니다 :

#define EVER ;;
  //...
  for (EVER) {
    //...
  }

현대와 시대를 EVS (청소년 이야기)로 바꾸어서는 안됩니다! 진지하게 나는 단순히 단순히 for (;;) {}를 사용합니다. 나는 오래 전에 온라인에서 두 사람의 차이점에 대해 읽었고 (어렸을 때 실제로 같은지 알지 못했을 때) 읽은 내용을 고수했습니다.
— Bja

8

나는 이것에 대해 한 번 들었다.

AMD 어셈블리 프로그래머가 제공 한 것입니다. 그는 C 프로그래머 (사람들)는 자신의 코드에 비 효율성이 있음을 깨닫지 못한다고 말했습니다. 그는 오늘 gcc 컴파일러는 매우 훌륭하며 그와 같은 사람들을 사업에서 제외 시켰다고 말했다. 그는 예를 while 1들어서 vs 에 대해 이야기했습니다 for(;;). 지금은 습관이 없지만 gcc 및 특히 통역사는 최적화되어 있기 때문에 요즘 두 가지 모두 동일한 작업 (프로세서 점프)을 수행합니다.


5

컴파일 된 언어의 최적화 된 빌드에서는 두 언어 사이에 뚜렷한 차이가 없어야합니다. 런타임에 비교를 수행해서는 안되며 루프를 수동으로 종료 할 때까지 (예 : a break) 루프 코드를 실행합니다 .


3

나는 아무도 제대로 테스트 없음을 놀라게하고 for (;;)대 while (1)펄!

perl은 해석 언어이므로 perl 스크립트를 실행하는 시간은 실행 단계 (이 경우 동일)뿐만 아니라 실행 전의 해석 단계로 구성됩니다. 속도 비교를 수행 할 때이 두 단계를 모두 고려해야합니다.

운 좋게도 perl에는 다음과 같은 벤치 마크를 구현하는 데 사용할 수 있는 편리한 벤치 마크 모듈 이 있습니다.

#!/usr/bin/perl -w

use Benchmark qw( cmpthese );

sub t_for   { eval 'die; for (;;) { }'; }
sub t_for2  { eval 'die; for (;;)  { }'; }
sub t_while { eval 'die; while (1) { }'; }

cmpthese(-60, { for => \&t_for, for2 => \&t_for2, while => \&t_while });

두 가지 버전의 무한 for 루프를 테스트하고 있습니다. 하나는 while 루프보다 짧고 다른 하나는 while 루프와 동일한 길이를 만들기 위해 여분의 공간이 있습니다.

perl 5.10.1이있는 Ubuntu 11.04 x86_64에서 다음과 같은 결과가 나타납니다.

          for2 동안의 요금
100588 / s---0 % -2 %
for 2 100937 / s 0 %--1 %
102147 / s 2 % 1 %-

while 루프는 분명히이 플랫폼의 승자입니다.

Perl 5.14.1이있는 FreeBSD 8.2 x86_64에서 :

         for2 동안의 요금
53453 / s---0 % -2 %
for 2 53552 / s 0 %--2 %
54564 / s 2 % 2 %-

while 루프가 여기에서도 승자입니다.

Perl 5.14.1이있는 FreeBSD 8.2 i386 :

         for2 동안 평가
24311 / s--1 % -1 %
24481 / s의 경우 1 %--1 %
2 24637 / s 1 % 1 %-

놀랍게도 여분의 공간을 가진 for 루프가 가장 빠른 선택입니다!

필자의 결론은 프로그래머가 속도를 최적화하는 경우 x86_64 플랫폼에서 while 루프를 사용해야한다는 것입니다. 공간을 최적화 할 때는 분명히 for 루프를 사용해야합니다. 불행히도 다른 플랫폼과 관련하여 결과가 결정적이지 않습니다.


9
결론은 끔찍하다. Benchmark제한이 있으며 결과가 서로 7 % 이내 인 경우 느린 것과 빠르게 구별하는 데 사용할 수 없습니다. 또한 각 서브가 루프 자체에 도달하기 전에 루프 for와 while서브 루프 의 차이를 테스트하지 않았습니다 die. 그리고 언제부터 공백의 양이 Perl 통역사에게 중요한가? 죄송하지만 분석에 결함이 있습니다.
— Zaid

2
@Zaid, 귀하의 의견에 감사드립니다! 모든 사람이 그로부터 배울 수 있도록 자신의 답변을 게시 하시겠습니까? :) die내 의도는 컴파일 시간 차이 만 테스트하기 때문에 코드에 있습니다. 다른 사람들이 이미 지적했듯이 결과 바이트 코드는 동일하므로 테스트 할 점이 없습니다. 놀랍게도 공백의 양은 테스트 환경에서이 경우에 약간의 차이를 만드는 것으로 보입니다. 캐릭터가 메모리 나 이와 유사한 것에 정렬되는 방식과 관련이있을 수 있습니다.
— snap

4
bdonlan이 이미 언급 한 내용을 언급 했으므로 답변을 게시 할 필요가 없습니다. 그리고 컴파일 시간을 비교하더라도 Benchmark결정적인 숫자 는 아닙니다. 그 1 %의 차이를 전혀 믿지 마십시오!
— Zaid

60 회만 반복합니까? 보다 정확한 상대 시간을 얻기 위해 약 5 분 동안 테스트를 실행하십시오.
— Mooing Duck

-6060 초 동안 테스트를 실행합니다.
— 스냅

2

이론적으로 완전히 순진한 컴파일러는 리터럴 '1'을 이진 (과잉 공간)에 저장하고 매번 반복 할 때마다 (시간과 공간을 더 많이 낭비) 1 == 0인지 확인할 수 있습니다.

그러나 실제로는 "아니오"최적화로도 컴파일러는 여전히 둘 다 동일하게 줄입니다. 또한 논리적 오류를 나타낼 수 있으므로 경고가 표시 될 수 있습니다. 예를 들어,의 인수는 while다른 곳에서 정의 할 수 있으며 그것이 일정하다는 것을 인식하지 못합니다.


2

원하는 어셈블리에 따라 더 직접적인 형식을 제공 한 사람이 아무도 없습니다.

forever:
     do stuff;
     goto forever;

c와 같이 1 또는 for (;;)와 동일한 머신 코드로 끝나지 않는 복용량?
— 코파스

1
이 접근 방식의 또 다른 단점은 블록에 루프를 묶지 않아 캡슐화를 위반하므로 루프에 선언 된 모든 변수를 루프 외부에서 사용할 수 있습니다. (물론, 당신은 할 수 있습니다 { forever: do stuff; goto forever; })
— Roy Tinker

2

while(1)for(;;)대부분의 컴파일러에서 인식 하는 관용구입니다 .

펄도 인식한다는 것을 알게되어 기뻤 until(0)습니다.


어떤 상황에서 (0)까지 도움이 되겠습니까?
— Copas

3
until ()은 while ()이 if ()의 반대 인 것처럼 while ()의 반대입니다. 이 스레드에서 제안 된 것처럼, 다음과 같이 작성할 수 있습니다 : do {something ...} while (! condition) 대안은 (condition) {something}까지
— JMD

2

for (;;)vs while (1)토론 을 요약하면, 최적화되지 않은 오래된 컴파일러의 시대에는 전자가 더 빠르다는 것이 분명합니다. 따라서 Lions Unix 소스 코드 해설과 같은 오래된 코드베이스에서 그것을 보는 경향이 있습니다. 컴파일러는 그 이익이 전자보다 더 이해하기 쉽다는 사실과 결합하여 최적화되어 있습니다.


2

방금이 스레드를 보았습니다 (몇 년이 늦었지만).

"for (;;)"가 "while (1)"보다 나은 실제 이유를 찾았습니다.

"바 코딩 표준 2018"에 따라

Kernighan & Ritchie long ago recommended for (;;) , which has the additional benefit
of insuring against the visually-confusing defect of a while (l); referencing a variable ‘l’.

기본적으로 이것은 속도 문제가 아니라 가독성 문제입니다. 코드의 글꼴 / 인쇄에 따라 한 번의 숫자 1은 소문자 l처럼 보일 수 있습니다.

즉 1 대 l. (일부 글꼴에서는 동일하게 보입니다).

따라서 while (1)은 변수 문자 L에 따라 while 루프처럼 보일 수 있습니다.

while (true)도 작동하지만 일부 오래된 C 및 임베디드 C의 경우 stdbool.h가 포함되어 있지 않으면 true / false가 아직 정의되지 않았습니다.


2
코드의 문제는 변수가 아닌 변수 l가 1있고 l유사하게 보일 수 있다는 것입니다.
— mjuopperi

동의합니다 .Barr 코딩 표준은 for 루프에서도 변수가 3 자 이상이어야한다고 다른 곳에서 말합니다. 즉, for 루프에 i ++ 등이 없습니다. 나는 그것이 조금 많을 수도 있다고 생각하는 경향이 있습니다. 타이핑하는 동안 나는 1처럼 보이는 문자 L만이 아니라는 것을 알았습니다. 변수로 일반적으로 사용되는 문자 i도 문제를 일으킬 수 있습니다.
— Nick Law

-3

성능 측면에서 두 가지가 동일하다고 생각합니다. 그러나 가독성을 위해 while (1)을 선호하지만 무한 루프가 필요한 이유에 대해 의문입니다.


-14

그들은 동일합니다. 숙고해야 할 훨씬 더 중요한 질문이 있습니다.


암시되었지만 명시 적으로 위에서 언급하지 않은 요점은 괜찮은 컴파일러가 두 루프 형식 모두에 대해 동일한 코드를 생성한다는 것입니다. 더 큰 요점은 루핑 구조가 알고리즘 실행 시간의 작은 부분이므로 먼저 알고리즘과 관련 알고리즘을 모두 최적화했는지 확인해야합니다. 루프 구성을 최적화하는 것은 우선 순위 목록의 맨 아래에 있어야합니다.


22
링크 나 설명이 없습니다. 도움이되지 않고 주관적이며 약간 혼란스러워합니다.
— cdmckay

1
증거는 없지만 그는 옳습니다. 둘 다 거짓 일 때 점프하기 위해 Opcode를 호출합니다. (고토로는 동일하게하지만 아무도 gotos를 좋아한다 것이다)
— 마태 복음 회칠 한

3
나는 어디에서 물어봐야 할 중요한 질문인지, 나의 실수는 나의 ​​첫 번째 질문이라는 것을 알지 못했다.
— Copas

3
그렇습니다. 그러나 진지하게도 아무런 증거가 없어도 동일한 구장에 속할 것임이 분명합니다. 질문이 스타일에 관한 것이면 논쟁해야 할 것이 있습니다. 나는 걱정할 것들의 목록에서 이것이 실제로 목록의 맨 아래에 있어야한다고 지적하려고했습니다.
— Mark Ransom

8
나는 바보가되지 않았습니다. 나는 지적하려고 노력했다. 내가 그것을 게시했을 때 나는 일종의 어두운 유머를 시도하고 있었고, 내가 실패한 것이 분명합니다. 그 점에 대해 사과드립니다.
— Mark Ransom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.