[C] 더 빠릅니다 : while (1) 또는 while (2)?


Answers

예, while(1)while(2) 보다 훨씬 빠르며 , 사람이 읽을 수 있습니다! while(1) 익숙하지 않은 코드베이스에서, 저자가 의도 한 바를 즉시 알게되고, 내 안구가 다음 줄로 계속 될 수 있습니다.

while(2) 나는 아마도 내 트랙에서 멈추고 while(1) 작성자가 쓰지 않은 이유를 알아 내려고 시도 할 것입니다. 저자의 손가락이 키보드에서 미끄러 졌습니까? 이 코드베이스의 메인테이너는 while(n) 루프를 다르게 보이게하는 애매한 코멘트 메커니즘으로 사용합니까? 고장난 정적 분석 도구에서 가짜 경고에 대한 일반적인 해결 방법이 있습니까? 아니면 생성 된 코드를 읽는 단서입니까? 불필요한 찾기 및 바꾸기, 병합 또는 우주선으로 인한 버그입니까? 어쩌면이 코드 라인은 극적으로 다른 것을하기로되어 있습니다. 어쩌면 그것은 while(w) 또는 while(x2) 읽어야 while(w) . 나는 파일의 역사에서 저자를 찾고 그들에게 "WTF"이메일을 보내는 것이 더 나을 것입니다 ... 그리고 지금 나는 내 정신적 맥락을 깨뜨 렸습니다. while(2) 는 내 시간의 몇 분을 소비 할 수 있는데, while(1) 은 몇 초의 시간이 걸릴 것입니다!

나는 과장하고있다. 그러나 단지 조금. 코드 가독성은 정말로 중요합니다. 인터뷰에서 언급 할만한 가치가 있습니다!

Question

고위 관리자가 묻는 면접 질문이었습니다.

어느 것이 더 빠릅니까?

while(1) {
    // Some code
}

또는

while(2) {
    //Some code
}

나는 내부의 표현이 마침내 true 또는 false 평가되어야하므로 둘 다 동일한 실행 속도를 갖는다 고 말했습니다. 이 경우 모두 true 평가되고 while 조건에는 추가 조건부 명령어가 없습니다. 따라서 둘 다 동일한 실행 속도를 가지며 선호하는 동안 (1).

그러나 면접관은 자신의 말로 "기본을 확인하십시오. while(1)while(2) 보다 빠릅니다." (그는 내 자신감을 테스트하지 않았다)

사실입니까?

참고 : "for (;;)"가 "while (TRUE)"보다 빠릅니까? 그렇지 않다면 사람들은 왜 그것을 사용합니까?




The only reason I can think of why the while(2) would be any slower is:

  1. The code optimizes the loop to

    cmp eax, 2

  2. When the subtract occurs you're essentially subtracting

    에이. 00000000 - 00000010 cmp eax, 2

    대신에

    비. 00000000 - 00000001 cmp eax, 1

cmp only sets flags and does not set a result. So on the least significant bits we know if we need to borrow or not with b . Whereas with a you have to perform two subtractions before you get a borrow.




나는 단서가 "고위 관리자가 물었다"에서 발견 될 것이라고 생각한다. 이 사람은 분명히 관리자가되었을 때 프로그래밍을 중단 한 다음 수석 관리자가되기까지 수년이 걸렸습니다. 프로그래밍에 대한 관심을 결코 잃지는 않았지만 그때 이후로 한 줄을 쓴 적이 결코 없습니다. 그래서 그의 참고 문헌은 몇 가지 답변을 언급 한 것처럼 "괜찮은 컴파일러"가 아니라 "이 사람이 20-30 년 전에 작업 한 컴파일러"입니다.

당시 프로그래머들은 '중앙 미니 컴퓨터'의 CPU 시간이 그다지 가치가 없었기 때문에 코드를 더 빠르고 효율적으로 만드는 다양한 방법을 시도하면서 상당한 시간을 보냈습니다. 사람들이 컴파일러를 쓰는 것처럼. 필자는 회사가 '최적화 할 수있는 자주 발생하는 문장'을 기반으로 최적화 된 당시 회사에서 사용할 수있는 유일한 컴파일러를 추측하고 잠시 (1) 만났을 때 약간의 단축키를 사용하여 모든 것을 평가했다고 생각합니다. 그 외에는 잠시 동안 (2)을 포함합니다. 그러한 경험을 가짐으로써 자신의 입장과 자신에 대한 자신감을 설명 할 수있었습니다.

당신을 고용하게하는 가장 좋은 방법은 아마도 수석 관리자가 흥분해서 다음 인터뷰 대상으로 이끌 기 전에 "프로그래밍의 좋은 옛날"에 대해 2-3 분 강의 할 수있는 방법 일 것입니다. (좋은 타이밍은 여기에서 중요합니다. 너무 빠르며 이야기를 방해합니다. 너무 느리고 초점이 충분하지 않은 사람으로 표시됩니다.) 인터뷰가 끝나면이 주제에 대해 더 많은 것을 알기를 바랍니다.




질문에 대한 가장 확실한 설명은 면접관이 프로세서가 0이 아닌 값에 도달 할 때까지 프로세서가 숫자의 개별 비트를 하나씩 확인한다고 생각하는 것입니다.

1 = 00000001
2 = 00000010

"0"인 경우 알고리즘은 숫자의 오른쪽에서부터 시작하여 0이 아닌 비트에 도달 할 때까지 각 비트를 검사해야합니다. while(1) { } 루프는 while(2) { } 와 같이 반복 당 두 비트를 확인해야합니다. 고리.

컴퓨터가 작동하는 방법에 대한 아주 잘못된 정신 모델이 필요하지만 자체 내부 논리가 있습니다. 한 가지 방법은 while(-1) { } 또는 while(3) { } 이 똑같이 빠르거나 while(32) { }더 느려지 는지 여부를 묻는 것입니다.




Maybe the interviewer posed such dumb question intentionally and wanted you to make 3 points:

  1. Basic reasoning. Both loops are infinite, it's hard to talk about performance.
  2. Knowledge about optimisation levels. He wanted to hear from you if you let the compiler do any optimisation for you, it would optimise the condition, especially if the block was not empty.
  3. Knowledge about microprocessor architecture. Most architectures have a special CPU instruction for comparision with 0 (while not necessarily faster).



They are both equal - the same.

According to the specifications anything that is not 0 is considered true, so even without any optimization, and a good compiler will not generate any code for while(1) or while(2). The compiler would generate a simple check for != 0 .




이렇게 많은 사람들이이 문제를 탐구하는 것을보기 위해 이것이 왜 마이크로 최적화 작업을 얼마나 빠르게 수행하는지 알 수있는 테스트가 될 수있는 이유를 정확하게 보여줍니다.

내 대답은 다음과 같다. 그다지 중요하지 않으며, 나는 우리가 해결하고있는 비즈니스 문제에 집중합니다. 결국, 그게 제가 돈을 지불하게 될 것입니다.

게다가 나는 while(1) {} 선택 while(1) {} 편이 더 일반적이기 때문에 다른 팀원이 왜 누군가가 1보다 높은 수의 숫자로 갈지를 결정할 시간을 할애 할 필요가 없습니다.

이제 코드를 작성하십시오. ;-)




기술 문제로 가면 나는 행동 면접 질문 중 하나입니다. 어떤 기업은 이것을 수행합니다. 유능한 프로그래머가 쉽게 대답 할 수있는 기술적 인 질문을 할 것이지만, 면접자가 정확한 대답을하면 면접관은 자신이 틀렸다는 것을 말할 것입니다.

회사는이 상황에서 당신이 어떻게 반응 할 것인지를 알고 싶어합니다. 조용히 거기에 앉아서 면접관을 화나게하는 것에 대한 자의심이나 두려움 때문에 답변이 정확하다고 강요하지 않습니까? 아니면 잘못 알고있는 권위있는 사람에게 기꺼이 도전 할 의향이 있습니까? 그들은 당신이 당신의 신념을 기꺼이 견뎌 낼 수 있는지, 그리고 당신이 재치 있고 정중 한 태도로 그것을 할 수 있는지 알고 싶습니다.




이 질문을 위해서, 필자는 C위원회의 Doug Gwyn이 옵티마이 저 패스가없는 일부 초기 컴파일러가 while(1) 대한 어셈블리 테스트를 생성한다는 것을 기억해야한다. 그것을 가지고있다).

면접관에게이 역사적인 쪽지를 주면서 대답 할 것이고, 그럼에도 불구하고 어떤 컴파일러가이 작업을 수행했는지 매우 놀랍지 만 컴파일러는 다음을 수행 할 수 있다고 말합니다.

  • 옵티 마이저가 없으면 컴파일러가 while(1)while(2) 테스트를 생성합니다.
  • 옵티 마이저 패스 (optimizer pass)를 사용하면 컴파일러는 모든 while(1) 무조건 점프로) 최적화하도록 지시받습니다. 왜냐하면 그것들은 관용적 인 것으로 간주되기 때문입니다. 이것은 while(2) 을 테스트와 함께 남겨두고 둘 사이의 성능 차이를 만듭니다.

나는 물론 면접관에게 while(1)while(2) 같은 구조가 같은 품질의 최적화의 표시 인 while(2) 고려하지 않는 것을 추가 할 것이다.




If you're that worried about optimisation, you should use

for (;;)

because that has no tests. (cynic mode)




잠깐. 면접관은 그 사람처럼 보이나요?

인터뷰 담당자 자신 이이 인터뷰에서 실패한 것만으로도 충분합니다 . 이 회사의 다른 프로그래머가이 테스트를 통과하면 어떻게 될까요?

아니오. 문장 1 == 02 == 0 평가하는 것이 똑같이 빠르다. 우리는 다른 컴파일러보다 빠른 컴파일러 구현을 상상할 수 있습니다. 그러나 왜 다른 사람보다 더 빨리되어야하는지에 대한 정당한 이유는 없습니다.

클레임이 사실 일 때 다소 불분명 한 상황이 있어도 프로그래머는 모호한 (이 경우 소름 끼치는) 퀴즈에 대한 지식을 토대로 평가해서는 안됩니다. 이 인터뷰에 대해 걱정하지 마세요, 여기서 가장 좋은 방법은 떠나는 것입니다.

면책 조항 : 이것은 원래 딜버트 만화가 아닙니다. 이것은 단순히 mashup 일뿐입니다.




Links