while(1)과 while(2) 중 어느 쪽이 빠릅니까?
이것은 상급 매니저의 인터뷰 질문이었습니다.
어느 쪽이 빠릅니까?
while(1) {
// Some code
}
또는
while(2) {
//Some code
}
모두 실행속도가 같다, 라는과 같이 실행속도가 . 안에 있는 표현처럼요.while
으로 true
★★★★★★★★★★★★★★★★★」false
이에는 둘 다 ' 쪽인가', '어느 쪽인가', '어느 쪽인가?true
는 따로 .while
둘 다 (1)이.따라서 둘 다 동일한 실행 속도를 가지며, 저는 (1)을 선호합니다.
하지만 면접관은 자신 있게 말했다. 기 "? while(1)
while(2)
.) (그는 나의 자신감을 시험하지 않았다.)
정말이에요?
참고 항목: "for(;)"가 "while(TRUE)"보다 빠릅니까? 그렇지 않다면 왜 사람들은 그것을 사용하는가?
두 루프 모두 무한하지만 반복마다 더 많은 명령/리소스가 필요한 루프를 확인할 수 있습니다.
gcc를 사용하여 다음 두 프로그램을 컴파일하여 다양한 최적화 수준으로 조립했습니다.
int main(void) {
while(1) {}
return 0;
}
int main(void) {
while(2) {}
return 0;
}
에도(「」 「」 「」 「」-O0
생성된 어셈블리는 두 프로그램에서 동일합니다.따라서 두 루프 사이에는 속도 차이가 없습니다.
어셈블리는 과 같습니다(:gcc main.c -S -masm=intel
"CHANGE: "CHANGE MANGHANGE:
★★★★★★★★★★★★★★★★ -O0
:
.file "main.c"
.intel_syntax noprefix
.def __main; .scl 2; .type 32; .endef
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
push rbp
.seh_pushreg rbp
mov rbp, rsp
.seh_setframe rbp, 0
sub rsp, 32
.seh_stackalloc 32
.seh_endprologue
call __main
.L2:
jmp .L2
.seh_endproc
.ident "GCC: (tdm64-2) 4.8.1"
★★★★★★★★★★★★★★★★ -O1
:
.file "main.c"
.intel_syntax noprefix
.def __main; .scl 2; .type 32; .endef
.text
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
sub rsp, 40
.seh_stackalloc 40
.seh_endprologue
call __main
.L2:
jmp .L2
.seh_endproc
.ident "GCC: (tdm64-2) 4.8.1"
★★★★★★★★★★★★★★★★ -O2
★★★★★★★★★★★★★★★★★」-O3
(그냥)
.file "main.c"
.intel_syntax noprefix
.def __main; .scl 2; .type 32; .endef
.section .text.startup,"x"
.p2align 4,,15
.globl main
.def main; .scl 2; .type 32; .endef
.seh_proc main
main:
sub rsp, 40
.seh_stackalloc 40
.seh_endprologue
call __main
.L2:
jmp .L2
.seh_endproc
.ident "GCC: (tdm64-2) 4.8.1"
실제로 루프용으로 생성된 어셈블리는 모든 최적화 수준에서 동일합니다.
.L2:
jmp .L2
.seh_endproc
.ident "GCC: (tdm64-2) 4.8.1"
중요한 비트는 다음과 같습니다.
.L2:
jmp .L2
조립체를 잘 읽을 수는 없지만, 이건 분명히 무조건적인 루프입니다.jmp
..L2
참말물론 프로그램이 종료될 때까지 즉시 다시 붙입니다.C/C++로 하다
L2:
goto L2;
편집:
흥미롭게도 최적화가 이루어지지 않은 경우에도 다음 루프가 모두 동일한 출력을 생성했습니다(무조건).jmp
어셈블리 내 ):
while(42) {}
while(1==1) {}
while(2==2) {}
while(4<7) {}
while(3==3 && 4==4) {}
while(8-9 < 0) {}
while(4.3 * 3e4 >= 2 << 6) {}
while(-0.1 + 02) {}
그리고 놀랍게도:
#include<math.h>
while(sqrt(7)) {}
while(hypot(3,4)) {}
사용자 정의 함수는 다음과 같이 약간 더 흥미로워집니다.
int x(void) {
return 1;
}
while(x()) {}
#include<math.h>
double x(void) {
return sqrt(7);
}
while(x()) {}
-O0
두 예시는 콜을 발신하고 있습니다 2 」 、 「 」x
및 각 반복에 대해 비교를 수행합니다.
첫 번째 예(반복 1):
.L4:
call x
testl %eax, %eax
jne .L4
movl $0, %eax
addq $32, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (tdm64-2) 4.8.1"
번째 예)sqrt(7)
.L4:
call x
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jp .L4
xorpd %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jne .L4
movl $0, %eax
addq $32, %rsp
popq %rbp
ret
.seh_endproc
.ident "GCC: (tdm64-2) 4.8.1"
,에서는-O1
두 예시와 , 즉 무조건, 무조건, 무조건, 무조건, 무조건, 무조건의 조합)을 냅니다.jmp
을 참조)
TL;DR
GCC에서는 다른 루프가 동일한 어셈블리로 컴파일 됩니다.컴파일러는 상수 값을 평가하여 실제 비교를 수행할 필요가 없습니다.
이 이야기의 교훈은 다음과 같습니다.
- C++ 소스 코드와 CPU 명령 사이에는 변환 레이어가 존재하며 이 레이어는 퍼포먼스에 중요한 영향을 미칩니다.
- 따라서 소스 코드만 보고 성능을 평가할 수 없습니다.
- 컴파일러는 이러한 사소한 케이스를 최적화할 수 있을 만큼 똑똑해야 합니다.프로그래머들은 대부분의 경우에 그들에 대해 생각하며 시간을 낭비해서는 안 된다.
ㅇㅇ.while(1)
가 훨씬 빠르다while(2)
, 사람이 읽을 수 있게!보면while(1)
낯선 코드베이스에서, 나는 저자가 무엇을 의도했는지 즉시 알 수 있고, 내 눈알은 다음 행까지 이어질 수 있다.
while(2)
잠시 왜가 글을 쓰지 하겠습니다while(1)
저자의 손가락이 키보드에서 미끄러졌나요?는 「」를 사용하고 ?while(n)
루프를 다르게 보이게 하는 모호한 코멘트 메커니즘으로요?일부 고장난 정적 분석 도구의 잘못된 경고에 대한 대략적인 회피책입니까?아니면 제가 생성된 코드를 읽고 있다는 단서인가요?잘못된 검색 및 교체, 잘못된 결합 또는 우주 광선 때문에 발생한 버그입니까?어쩌면 이 코드 라인은 뭔가 극적으로 다른 일을 해야 할지도 몰라. 마마 maybe maybe maybe maybe라고 쓰여있었을 예요.while(w)
★★★★★★★★★★★★★★★★★」while(x2)
WTF'는인 맥락이 것 요.더 제while(2)
분 정도 수 .while(1)
1 초 1 1번!
과장이지만 조금밖에 안 돼요.코드 가독성은 매우 중요합니다.그리고 그것은 인터뷰에서 언급할 가치가 있다!
잠깐만.면접관, 그 사람 닮았나요?
면접관 자신이 이 면접에서 떨어진 것은 매우 유감입니다.만약 이 회사의 다른 프로그래머가 이 테스트를 "합격"했다면 어떻게 해야 할까요?
입니다. 스테이트먼트의 평가1 == 0
★★★★★★★★★★★★★★★★★」2 == 0
똑같이 빨라야 합니다.한쪽이 다른 쪽보다 빠를 수 있는 컴파일러의 구현이 불충분하다고 생각할 수 있습니다.하지만 둘 중 하나가 다른 것보다 더 빨라야 할 이유는 없습니다.
비록 그 주장이 사실일 때 애매한 상황이 있더라도 프로그래머는 애매한(이 경우 소름끼치는) 잡지에 대한 지식을 바탕으로 평가되어서는 안 된다.이 인터뷰는 걱정하지 마세요. 여기서 가장 좋은 방법은 떠나는 거예요.
면책사항:이것은 오리지널 딜버트 만화가 아니다.이건 그냥 매쉬업이야
특정 컴파일러에 의해 생성된 특정 타깃의 코드를 특정 옵션세트와 함께 보여주는 기존 답변은 해당 컨텍스트에서 질문되지 않는 한 질문에 완전히 답하지 않습니다(예를 들어 기본 옵션과 함께 gcc 4.7.2 for x86_64를 사용하는 것이 빠른가).
언어의 정의에 관한 한, 추상 기계에서 while (1)
상수 " " "를 합니다.1
, , , , 입니다.while (2)
상수 " " "를 합니다.2
; 두 경우 모두 결과는 0과 동등하게 비교됩니다.언어 표준에서는 두 구성 요소의 상대적 성능에 대해 전혀 언급하지 않습니다.
최소한 최적화를 요구하지 않고 컴파일 했을 때, 지극히 순진한 컴파일러는 두 가지 형식에 대해 다른 기계 코드를 생성할 수 있습니다.
한편, C 컴파일러는 일정한 표현이 필요한 컨텍스트에 표시되는 경우 컴파일 시 반드시 일정한 표현을 평가해야 합니다.예를 들어 다음과 같습니다.
int n = 4;
switch (n) {
case 2+2: break;
case 4: break;
}
진단이 합니다.게으른 에게는 '평가가 '의 를 연기하는 옵션이 .게으른 컴파일러는 평가를 연기할 수 있는 옵션이 없습니다.2+2
실행 시간까지.컴파일러는 컴파일 시에 일정한 표현식을 평가할 수 있어야 하기 때문에 필요하지 않은 경우에도 그 기능을 이용하지 않을 이유가 없습니다.
C 표준(N1570 6.8.5p4)에서는 다음과 같이 기술되어 있습니다.
반복문을 사용하면 제어식이 0과 같을 때까지 루프 본문이라는 문이 반복적으로 실행됩니다.
관련된 은 '일부러' 입니다.1 == 0
★★★★★★★★★★★★★★★★★」2 == 0
다 「」로 int
가 value0
( 비교는 (의 의미론)에while
실제 C 식으로는 존재하지 않습니다.)
비뚤어진 순진한 컴파일러는 두 구조에 대해 다른 코드를 생성할 수 있습니다.예를 들어, 첫 번째로 무조건 무한 루프를 생성할 수 있습니다.1
로서) 두 로, 은 명백한 실행 할 수 있습니다.2 != 0
하지만실제로 그렇게 동작하는 C컴파일러는 본적이 없고,그런컴파일러가 존재하는지 의심스럽다.
대부분의 컴파일러(모든 프로덕션 품질의 컴파일러)에는 추가 최적화를 요구하는 옵션이 있습니다.이러한 옵션에서는 컴파일러가 두 가지 형식에 대해 다른 코드를 생성할 가능성이 훨씬 낮아집니다.
컴파일러가 두 구조에 대해 다른 코드를 생성하는 경우, 먼저 다른 코드 시퀀스가 실제로 다른 성능을 가지고 있는지 확인합니다.이 경우 최적화 옵션을 사용하여 컴파일을 다시 시도합니다(사용 가능한 경우).그래도 다를 경우 오류 보고서를 컴파일러 벤더에 제출합니다.C규격에 준거하지 않는 것은 (필요한) 오류는 아니지만, 수정이 필요한 것은 거의 확실합니다.
바닥:결론:while (1)
그리고 그리고.while(2)
거의 확실히 같은 성능을 가지고 있습니다.이들 컴파일러는 완전히 동일한 의미를 가지며 컴파일러가 동일한 코드를 생성하지 않을 이유가 없습니다.
그리고 완벽하게 합법적인 것을 지키기 위해 컴파일러컴파일러가더 빠른의 더욱 빨라진 코드를 생성하는 데것은 완전히 합법적이지만 생성하는 코드를.while(1)
을 위해서보다while(2)
에 대한 컴파일러컴파일러가보다 빠른의 더욱 빨라진 코드것도 합법입니다 생성하는 코드를을 생성하는 데, 합법적인 것이죠.while(1)
가의발생할 경우보다 다시 다른 발생에 대한 것보다 더 낫다고 생각while(1)
같은 프로그램에서.같은 프로그램에서.
(당신이 한 질문에는 또 다른 질문이 내포되어 있습니다.잘못된 기술적 요점을 고집하는 면접관을 어떻게 대합니까?Workplace 사이트에는 좋은 질문이 될 것입니다).
당신의 설명은 옳습니다.이것은 기술적인 지식뿐만 아니라 당신의 자신감을 시험하는 질문인 것 같습니다.
그나저나, 당신이 대답한다면
둘 다 완료하는 데 시간이 무한히 걸리기 때문에 두 코드 모두 똑같이 빠릅니다.
면접관은 이렇게 말할 것이다.
★★★★★★★★★★★★★★★★★.
while (1)
초당 더 많은 반복을 수행할 수 있습니다. 다시을 시험하다
그렇게 대답함으로써 시간을 절약할 수 있었습니다.그렇지 않으면 이 나쁜 질문에 대해 논의하는 데 낭비하게 될 것입니다.
다음은 시스템(MS Visual Studio 2012)의 컴파일러가 최적화를 끈 상태에서 생성한 코드 예입니다.
yyy:
xor eax, eax
cmp eax, 1 (or 2, depending on your code)
je xxx
jmp yyy
xxx:
...
최적화가 켜져 있는 경우:
xxx:
jmp xxx
따라서 생성된 코드는 최소한 최적화 컴파일러와 완전히 동일합니다.
질문에 대한 가장 유력한 설명은 프로세서가 제로가 아닌 값에 도달할 때까지 숫자의 개별 비트를 하나씩 체크한다고 면접관은 생각하는 것입니다.
1 = 00000001
2 = 00000010
0'하여 비트가할 때까지 각 비트를 , "is 0?"은 0입니다.while(1) { }
반복당 .while(2) { }
loopsyslog.syslog..syslog.
이것은 컴퓨터가 작동하는 방식에 대한 매우 잘못된 정신 모델을 요구하지만, 그것만의 내부 논리가 있습니다.의 한 가지 은 혹시 모르니 입니다.while(-1) { }
★★★★★★★★★★★★★★★★★」while(3) { }
마찬가지로 빠를 수도 있습니다.while(32) { }
더 느릴 거예요.
C 하지 않는 C 시 한 것을 합니다.while(1)
: (예:)에)for(;;)
런런 、 을을야야런은 。
저는 인터뷰 진행자에게 이 역사적인 메모를 전달하고, 어떤 컴파일러가 이런 일을 했다고 해도 컴파일러는 다음과 같이 대답합니다.
- 하지 않으면 optimizer pass에 합니다.
while(1)
★★★★★★★★★★★★★★★★★」while(2)
- 는 all optimizer pass(됩니다.
while(1)
이치노 이 the 가 남습니다.while(2)
테스트를 통해 두 가지 사이에 성능 차이가 생깁니다.
에게는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★while(1)
★★★★★★★★★★★★★★★★★」while(2)
동일한 구조는 저품질 최적화의 신호이며, 이는 동등한 구조이기 때문이다.
단서는 '상사의 부탁'에서 찾을 수 있을 것 같다.이 사람은 매니저가 되었을 때 프로그래밍을 중단하고 상급 매니저가 되기까지 몇 년이 걸렸습니다.프로그래밍에 흥미를 잃은 적은 없지만 그 이후로는 한 줄도 쓰지 않았다.그래서 그가 언급하는 것은 몇몇 답변에서 언급되는 "어느 괜찮은 컴파일러도 아니다"가 아니라 "이 사람이 20~30년 전에 함께 일했던 컴파일러"입니다.
당시 프로그래머들은 '중앙 미니컴퓨터'의 CPU 시간이 가치가 높아 코드를 더 빠르고 효율적으로 만드는 다양한 방법을 시도하는데 많은 시간을 할애했다.컴파일러를 쓰는 사람들처럼요당시 그의 회사에서 유일하게 이용할 수 있게 된 컴파일러는 '최적화할 수 있는 자주 접하는 스테이트먼트'를 바탕으로 최적화되어 있었고, 잠시 (1)를 만났을 때 약간의 숏컷을 취했고, 그 이외의 모든 것을 평가(2)했을 것이라고 생각합니다.그런 경험을 하면 그의 입장과 자신감을 설명할 수 있을 것이다.
고용을 위한 최선의 접근법은 아마도 상급 매니저가 흥분하여 다음 인터뷰 대상으로 부드럽게 이끌기 전에 2~3분 동안 "프로그래밍의 좋았던 시절"에 대해 강의할 수 있도록 하는 것입니다. (여기서는 타이밍이 너무 중요하기 때문에 이야기를 방해하기 때문에 너무 느리고 당신은 어떤 사람으로 분류됩니다.초점 부족)인터뷰가 끝날 때 그에게 이 주제에 대해 더 자세히 알고 싶다고 꼭 말하세요.
물론 저는 이 매니저의 진짜 의도를 모릅니다만, 전혀 다른 견해를 제안합니다.팀에 새로운 멤버를 채용할 때, 그가 갈등 상황에 어떻게 반응하는지 아는 것은 유용합니다.
그들은 당신을 갈등으로 몰아넣었다.만약 이것이 사실이라면, 그들은 똑똑하고 질문이 좋았다.은행과 같은 일부 업계에서는 Stack Overflow에 문제를 게시하는 것이 거절의 이유가 될 수 있습니다.
하지만 난 몰라, 난 단지 한 가지 옵션을 제안할 뿐이야.
그에게 어떻게 그런 결론에 도달했는지 물어봤어야 했다.이 두 컴파일러는 모두 동일한 asm 명령어로 컴파일됩니다.그럼 컴파일러에게도 시작하라고 했어야죠그렇다고 해도 이론적인 지식을 갖춘 추측을 하기 위해서는 컴파일러와 플랫폼을 잘 알아야 합니다.메모리 플래그멘테이션이나 시스템 부하 등 루프에 영향을 미치는 다른 외부 요인이 있기 때문에 실제로는 문제가 되지 않습니다.
최적화가 그렇게 걱정된다면
for (;;)
왜냐하면 그건 테스트가 없으니까요.(cynic 모드)
제가 보기엔 이건 기술적인 질문으로 위장된 행동 면접 질문 중 하나인 것 같아요.일부 기업에서는 유능한 프로그래머라면 누구나 쉽게 대답할 수 있는 기술적인 질문을 하지만 면접자가 정답을 말하면 면접관은 틀렸다고 말합니다.
회사는 당신이 이 상황에서 어떻게 반응할지 알고 싶어 합니다.당신은 면접관을 당황하게 할까봐 자신의 답이 맞다고 강요하지 않고 조용히 앉아있나요?아니면 당신이 잘못 알고 있는 권위에 있는 사람에게 이의를 제기할 의향이 있습니까?그들은 당신이 당신의 신념을 지킬 의향이 있는지, 그리고 당신이 재치 있고 존경스러운 방법으로 그것을 할 수 있는지 보고 싶어한다.
이러한 질문에 대한 또 다른 견해는 매니저에게 틀렸다고 말할 용기가 있는지 확인하는 것입니다.그리고 얼마나 부드럽게 소통할 수 있는지.
처음에는 어셈블리 출력을 생성하여 제대로 된 컴파일러가 관리해야 한다는 것을 매니저에게 보여주고, 그렇지 않으면 다음 패치를 제출합니다.
면접관이 일부러 그런 바보 같은 질문을 던져서 세 가지 요점을 말하려고 했을 수도 있어요.
- 기본적인 추리.두 루프 모두 무한대이기 때문에 성능에 대해서는 말하기 어렵습니다.
- 최적화 수준에 대한 지식컴파일러가 당신에게 최적화를 시키면 특히 블록이 비어 있지 않으면 상황이 최적화될 것입니다.
- 마이크로프로세서 아키텍처에 관한 지식.대부분의 아키텍처에는 0과의 비교를 위한 특별한 CPU 명령이 있습니다(단, 반드시 빠른 것은 아닙니다).
이런 말도 안 되는 일이 변화를 줄 수 있을 때 C와 어셈블리 코드를 다시 프로그래밍하곤 했어요.그것이 차이를 만들었을 때 우리는 그것을 의회에서 썼다.
만약 내가 그 질문을 받았다면 나는 1974년 도널드 커누스의 섣부른 최적화에 대한 유명한 인용문을 반복하고 인터뷰 진행자가 웃지 않았다면 걸어갔을 것이다.
할 수 는 '왜'가 '왜'인가 것이다.while(2)
수 있을까요이렇게 하면 안 돼요?
코드는 루프를 최적화하여
cmp eax, 2
뺄셈이 발생하면 기본적으로 빼는 것입니다.
a. a.
00000000 - 00000010 cmp eax, 2
대신
b.
00000000 - 00000001 cmp eax, 1
cmp
는 플래그만 설정하고 결과는 설정하지 않습니다.따라서 b를 사용하여 빌릴 필요가 있는지 없는지는 최소한 알 수 있습니다.반면 a의 경우 두 번의 뺄셈을 수행해야 합니다.
많은 사람들이 이 문제를 깊이 파고드는 것을 보면, 이 문제가 얼마나 빨리 마이크로 최적화를 원하는지를 알 수 있는 테스트가 될 수 있는지 정확하게 알 수 있습니다.
제 대답은 이렇습니다.그건 별로 중요하지 않아요.저는 우리가 해결하고 있는 비즈니스 문제에 초점을 맞추고 있습니다.결국, 그게 내가 돈을 받을 이유야.
나는 나나나 for를 이다.while(1) {}
왜냐하면 이것은 더 흔하고, 다른 팀원들은 왜 누군가가 1보다 높은 숫자를 선택하는지 알아내기 위해 시간을 쓸 필요가 없기 때문이다.
그럼 가서 코드를 쓰세요.;-)
여기 문제가 있습니다.실제로 프로그램을 작성하고 속도를 측정하면 두 루프의 속도가 다를 수 있습니다!합리적인 비교를 위해:
unsigned long i = 0;
while (1) { if (++i == 1000000000) break; }
unsigned long i = 0;
while (2) { if (++i == 1000000000) break; }
시간을 인쇄하는 코드가 추가되면 루프가 1개 또는 2개의 캐시 라인 내에서 어떻게 배치되는지와 같은 랜덤한 효과가 영향을 미칠 수 있습니다.1개의 루프가 1개의 캐시 라인 내에 완전히 존재하거나 캐시 라인이 시작될 때 또는 2개의 캐시 라인에 걸쳐 있을 수 있습니다.그 결과, 면접관이 가장 빠르다고 주장하는 것이 실제로 가장 빠를 수 있습니다. 우연의 일치로요.
최악의 경우:최적화 컴파일러는 루프가 무엇을 하는지 알아내는 것이 아니라 두 번째 루프가 실행될 때 생성되는 값이 첫 번째 루프가 생성한 값과 같다는 것을 알아냅니다.첫 번째 루프에 대해 완전한 코드를 생성하지만 두 번째 루프에 대해서는 생성하지 않습니다.
둘 다 똑같다.
사양에 따르면 0이 아닌 것은 모두 true로 간주되기 때문에 최적화가 없어도 좋은 컴파일러는 while(1) 또는 while(2) 동안 코드를 생성하지 않습니다.를 생성합니다.!= 0
.
사람들이 테스트하고, 증명하고, 이 매우 솔직한 질문에 답하는 데 소비한 시간과 노력으로 미루어 볼 때, 이 두 가지 모두 질문을 함으로써 매우 느려졌다고 말할 수 있다.
그래서 더 많은 시간을 할애하기 위해...
"while (2)"는 말도 안 돼요, 왜냐하면
"while (1)" 및 "while (true)"는 루프 내부의 어떤 단계에서 반드시 발생할 조건에 기초하여 "break"이 호출될 것으로 예상하는 무한 루프를 만들기 위해 역사적으로 사용됩니다.
"1"은 항상 참으로 평가하기 위해 존재하며, 따라서 "(2)"은 "한편 (1 + 1 == 2)"이라고 말하는 것과 거의 같은 바보가 되며, 이는 또한 참으로 평가될 것이다.
그리고 당신이 완전히 바보처럼 굴고 싶다면, 그냥 사용하세요: -
while (1 + 5 - 2 - (1 * 3) == 0.5 - 4 + ((9 * 2) / 4.0)) {
if (succeed())
break;
}
당신의 코더가 코드 실행에 영향을 주지 않는 오타를 범했다고 생각하고 싶습니다만, 만약 그가 단지 이상하기 위해 의도적으로 "2"를 사용했다면, 그가 당신의 코드에 이상한 sh!t를 넣기 전에 그를 해고해야 합니다.이 때문에 읽고 작업하기가 어렵습니다.
컴파일러에 따라 다릅니다.
코드를 최적화하거나 특정 명령 집합에 대해 동일한 수의 명령을 사용하여 1과 2가 true로 평가되면 실행 속도는 동일합니다.
실제 상황에서는 항상 동일하게 빠릅니다만, 이것이 다르게 평가될 경우 특정 컴파일러와 특정 시스템을 상상할 수 있습니다.
내 말은, 이건 언어(C)에 관련된 질문이 아니라는 거야.
이 질문에 대한 답변을 원하는 사람들은 가장 빠른 루프를 원하기 때문에, 나는 다른 답변과 같이 두 사람이 동일한 어셈블리 코드로 컴파일하고 있다고 대답했을 것이다.단, while loop 대신 do {} while loop을 사용하여 면접관에게 제안할 수 있습니다.
주의:루프가 항상 1회 이상 실행되도록 해야 합니다.
루프 내부에는 중단 조건이 있어야 합니다.
또한 이러한 루프에는 개인적으로 do {} while(42)을 사용하는 것이 좋습니다. 왜냐하면 0을 제외한 모든 정수가 작업을 수행할 수 있기 때문입니다.
분명한 답은 게시된 대로 두 fragment가 똑같이 바쁜 무한 루프를 실행하므로 프로그램이 무한히 느려진다는 것입니다.
C 키워드를 매크로로 재정의하면 기술적으로 정의되지 않은 동작이 됩니다만, 어느 쪽의 코드 프래그먼트를 고속으로 할 수 있는 것은 이것뿐입니다.다음 2개의 fragment 위에 다음 행을 추가할 수 있습니다.
#define while(x) sleep(x);
확실히 된다while(1)
배 느리다)while(2)
언급URL : https://stackoverflow.com/questions/24848359/which-is-faster-while1-or-while2
'source' 카테고리의 다른 글
vue.js 및 부트스트랩 4를 사용한 팝오버 (0) | 2022.08.27 |
---|---|
-j4 또는 -j8과 함께 make 사용 (0) | 2022.08.27 |
메이븐 부모 폼 vs 모듈 폼 (0) | 2022.08.27 |
Vuex 모듈에서 "뒤틀림"을 방지하기 위해 어떤 이름을 사용합니까? (0) | 2022.08.27 |
webpack-simple Vue.js 템플릿에서 콘솔에서 Vue 앱에 액세스하는 방법은 무엇입니까? (0) | 2022.08.21 |