source

"for(;)"가 "while(true)"보다 빠릅니까?그렇지 않다면 왜 사람들은 그것을 사용하는가?

gigabyte 2022. 8. 15. 21:22
반응형

"for(;)"가 "while(true)"보다 빠릅니까?그렇지 않다면 왜 사람들은 그것을 사용하는가?

for (;;) {
    //Something to be done repeatedly
}

「 」 「 」 。 게 훨씬 더 하지 않을까요while(true)니면면 그런 ?? ???

(다중 프로그래머가 암호 코드에 의존하는 이유와 같이) 조금 더 빠른가?

왜, 그리고 정말 그럴 가치가 있을까요?그렇다면 다음과 같이 정의하면 어떨까요?

#define while(true) for(;;)

다음 항목도 참조하십시오.while(1)과 while(2) 중 어느 쪽이 빠릅니까?

  1. 더 빠르지 않아요.
  2. 정말로 관심이 있는 경우는, 사용의 플랫폼의 어셈블러 출력을 사용해 컴파일 해, 확인해 주세요.
  3. 그건 중요하지 않아.이건 중요하지 않아.무한 루프를 원하는 대로 쓰세요.

는 는는더 prefer prefer ifor(;;)두 가지 이유 때문에.

에 따라서는 경고 입니다.while(true)('알다')을 사용법

하나는 제가 에 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.for(;;)더 명확하고 더 많은 것을 알 수 있습니다.무한 루프를 원해그대로 조건도 없고, 아무것도 의존하지 않습니다.난 그저 영원히 지속되길 바랄 뿐이야. 내가 뭔가 탈옥할 때까지 말이야.

, ★★★★while(true)아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아!참말이것은 이 형식이 말 그대로(true가 true일 때 루프)라고 하는 것입니다.츠미야

퍼포먼스에는 전혀 차이가 없습니다.

데니스 리치 때문에

  • 사용하기 시작했습니다.for (;;)왜냐하면 그게 K&R에서 데니스 리치가 하는 방식이고, 새로운 언어를 배울 때는 항상 똑똑한 남자들을 흉내내려고 노력하거든요.

  • 이것은 관용적인 C/C++입니다.C/C++ 공간에서 많은 일을 할 계획이라면 장기적으로 익숙해지는 것이 더 나을 수 있습니다.

  • 의 ★★★★★★★★★★★★★★★★★.#define#define'd' C # # # # # # # 。

  • 모든 최신 컴파일러는 두 개의 구조에 대해 동일한 코드를 생성합니다.

는 는는더 prefer prefer ifor (;;)왜냐하면 다른 C 언어에서 가장 일관성이 있기 때문입니다.

C++ 인while (true)하여 "C"를 정의합니다.true, 아직, 아직, 갱신되지 않았다TRUE자주 사용되는 매크로이기도 합니다.「 」를 사용하고 while (1) JavaScript에서는 나 C#에서는 않습니다.경우 C' C++, JavaScript C# 등의 .이러한 루프 조건은 다음과 같이 부울이어야 합니다.while (true) ★★★★★★★★★★★★★★★★★」while (1 == 1) PHP를 TRUE.

★★★★★★★★★★★★★★.for (;;)이치노

개인적으로는 사용하고 있습니다.for (;;)★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★는 나는 i i보다 더 좋다while (true),while (1),while (42),while (!0)기타 등등.

가치 있는 컴파일러가 다른 코드를 생성한다는 것은 상상할 수 없습니다.어떤 컴파일러가 더 효율적인지 테스트하지 않고는 판단할 수 없습니다.

, 저는 이 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★for(;;)이치노

  • 사용하고 있는 컴파일러의 수는 적절한 경고 수준의 설정을 수반하는 동안(true) 일정한 식 경고를 생성합니다.

  • 이 예에서는 매크로 TRUE가 예상대로 정의되지 않을 수 있습니다.

  • 가지 가능한 변형이 있습니다. 예를 , 무한 while 루프에는 한 there 、 음 、 음 、 음 、 음 、 음 、 음 、 음 、 음 、 there there 、 there there there there 。while(1),while(true),while(1==1)즉, ;, ;, ;;for(;;)일관성이 향상될 가능성이 있습니다.

while(true)

Visual Studio에서 경고를 생성합니다(조건은 일정함).제가 일했던 대부분의 장소는 프로덕션 빌드를 컴파일하고 경고를 오류로 표시합니다.그렇게

for(;;)

권장됩니다.

정상적인 컴파일러라면 확실히 빠르지 않습니다.둘 다 무조건 점프로 집계된다.(Neil이 말한 바와 같이) for 버전은 입력하기 쉽고 루프 구문을 이해하면 명확해집니다.

궁금하시다면 gcc 4.4.1에서 제공하는 x86을 소개합니다.둘 다 x86 JMP 명령을 사용합니다.

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

컴파일 대상(부분):

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L2:
    movl    $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L5:
    movl    $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite

생성되는 기계코드에는 차이가 없습니다.

단, 트렌드를 거스르기 위해 while(TRUE) 형식이 (;;)보다 훨씬 읽기 쉽고 직관적이며, 가독성과 명료성이 코딩 가이드라인의 중요한 이유라고 생각합니다(나는 확실한 추론 및/또는 유효성의 증명에 근거하고 싶다).엘프)

는 개인적으로 ★★★★★★★★★★★★★★★★★★를 선호합니다.for (;;))while (TRUE)

「」를 사용합니다.while (TRUE)에서는 좀 더 쉬울지도 , 는 이 책을 for (;;)에 띄기 때문에 사자성어.

알수할 수 , 저는 으로 '무한 루프 구조'라고 합니다.for (;;)스타일은 이것을 조금 더 잘 한다.while (TRUE) ★★★★★★★★★★★★★★★★★」while (1).

또한 while loop의 제어식이 일정할 경우 경고를 보내는 컴파일러도 있었던 것으로 기억합니다.그런 일은 별로 없다고 생각합니다만, 가짜 경고의 가능성만으로 피하고 싶다고 생각하고 있습니다.

어느 쪽이 빠른지는 개인적인 취향의 문제이다.개인적으로 저는 터치 타이피스트이기 때문에 프로그래밍 중에는 키보드를 보지 않습니다.키보드 104 키를 모두 터치할 수 있습니다.

"while (TRUE)" 라고 입력하는 것이 더 빠릅니다.

나는 정신적으로 손가락의 움직임 측정치를 더해서 합계를 냈다."for(;)"는 앞뒤로 약 12개의 키 폭(홈 키와 키 사이, 그리고 "Home 키와 SHIFT 키 사이)이 있는 반면 "TRUE"는 앞뒤로 약 14개의 키 폭(key width)이 있다.

그러나 후자를 입력할 때 오류가 훨씬 덜 발생합니다.나는 마음속으로 한 번에 단어를 생각하기 때문에 "nIdx"와 같은 줄임말보다 "nIndex"와 같은 것을 입력하는 것이 더 빠르다고 생각한다. 왜냐하면 나는 실제로 마음속으로 말하는 것보다 글자를 철자해야 하고 내 손가락이 단어를 자동으로 타이핑하도록 해야 하기 때문이다(자전거 타는 것처럼).

(TypingTest.com 벤치마크= 136 WPM )

(true)가 (;;)보다 더 읽기 쉽다고 생각합니다.프로그래머가 루프를 놓치고 있는 것처럼 보입니다.

다음과 같은 #define을 가지고 있기 때문에 선호하는 사람도 있습니다.

#define EVER ;;

이를 통해 다음과 같은 내용을 작성할 수 있습니다.

for (EVER)
{
    /* blah */
}

컴파일러에 의해 코드가 최적화되어 있는 경우는, 양쪽 모두 같습니다.최적화의 의미를 설명하기 위해 MSVC 10에 기재되어 있는 샘플코드를 다음에 나타냅니다.

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

디버깅 모드(최적화(/Od) 없음)로 빌드하면 디스어셈블리에 의해 명확한 차이가 나타납니다.에 대한 추가 절차가 있습니다.true while.

while(true)
00D313A5  mov         eax,1                //extra 
00D313AA  test        eax,eax              //extra
00D313AC  je          main+39h (0D313B9h)  //extra
    {
        x +=1;
00D313AE  mov         eax,dword ptr [x]  
00D313B1  add         eax,1  
00D313B4  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D313B7  jmp         main+25h (0D313A5h)  


for(;;)
    {
        x +=1;
00D213A5  mov         eax,dword ptr [x]  
00D213A8  add         eax,1  
00D213AB  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D213AE  jmp         main+25h (0D213A5h)  

다만, 릴리스 모드(디폴트에서는 최대 속도(/O2)로)로 코드를 빌드하면, 양쪽 모두에서 같은 출력이 표시됩니다.두 루프가 모두 한 번의 점프 명령으로 감소한다.

for(;;)
    {
        x +=1;
01291010  inc         esi  

        printf("%d", x);
    ...
    }
0129101C  jmp         main+10h (1291010h)  

    while(true)
    {
        x +=1;
00311010  inc         esi  

        printf("%d", x);
    ...
    }
0031101C  jmp         main+10h (311010h)  

어느 쪽을 사용하든 속도 최적화가 켜져 있는 괜찮은 컴파일러에게는 문제가 되지 않습니다.

(사용하시는 언어가 지원하는 경우)에 대해서:

start:
/* BLAH */
goto start;

모든 좋은 답변 - 행동은 완전히 동일해야 합니다.

그러나 - 그것이 차이를 만들었다고 가정해 보십시오.이들 중 한 명이 반복당 3개의 명령을 더 받았다고 가정합니다.

신경써야 하나요?

루프 내에서 수행하는 작업이 거의 아무것도 아닌 경우에만 해당됩니다.

제 요점은 미세 최적화와 거시 최적화가 있다는 것입니다.미세 최적화는 살을 빼기 위해 머리를 자르는 것과 같다.

다른 사람들이 지적한 것처럼 기술적인 관점에서 그것은 전혀 문제가 되지 않는다.어떤 사람들은 어떤 것이 다른 것보다 더 읽기 쉽다고 생각하고 어떤 것에 대한 다른 의견을 가지고 있다.

그건 기본적으로 트집잡기일 뿐이에요. 왜냐하면 C 프로그래머라면 그 두 가지를 즉시 인식할 수 있을 테니까요.while(1) ★★★★★★★★★★★★★★★★★」for(;;)무한 루프로서.

정의가 작동하지 않습니다.단, 다음과 같이 할 수 있습니다(단, 해서는 안 됩니다).

#define repeat for(;;)

int main(void)
{
    repeat {
        puts("Hello, World");
    }
}

근데 진짜 그런 거 하지 마...

for(;;Sleep(50))
{
    // Lots of code
}

다음보다 명확합니까?

while(true)
{
    // Lots of code
    Sleep(50);
}

않은 되지 않습니다.Sleep().

잘 알려진 패턴뿐만 아니라 C(및 C++)의 표준 관용어

"영원한" 루프는 백그라운드 루프로 임베디드 시스템에서 널리 사용됩니다.다음과 같이 구현되는 사람도 있습니다.

for (; ;)
{
 // Stuff done in background loop
}

또, 다음과 같이 실장되는 경우도 있습니다.

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

또 다른 구현은 다음과 같습니다.

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

최적화 컴파일러는 이러한 fragment에 대해 같거나 유사한 어셈블리 코드를 생성해야 합니다.한 가지 중요한 주의: 루프 실행 시간은 큰 문제가 되지 않습니다.이러한 루프는 영속적으로 계속되기 때문에 처리 섹션에서 더 많은 시간이 소비되기 때문입니다.

'for(;;)'를 사용하는 가장 중요한 이유는 탐색 프로그래밍을 할 때 'while(TRUE)'을 사용하는 것에 대한 두려움입니다."for"를 사용하여 반복 횟수를 제어하기가 쉽고 "for" 루프를 무한대로 변환하는 것도 쉽습니다.

예를 들어, 재귀 함수를 구성하는 경우 무한 루프로 변환하기 전에 함수에 대한 호출량을 제한할 수 있습니다.

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

기능이 확실하면 무한 루프로 변환합니다.

    for(;;) recursiveFunction(oneParam);

언급URL : https://stackoverflow.com/questions/2611246/is-for-faster-than-while-true-if-not-why-do-people-use-it

반응형