(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 % 이내 인 경우 느린 것과 빠르게 구별하는 데 사용할 수 없습니다. 또한 각 서브가 루프 자체에 도달하기 전에 루프 forwhile서브 루프 의 차이를 테스트하지 않았습니다 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
코드의 문제는 변수가 아닌 변수 l1있고 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.