2013-08-23 2 views
5

고전적인 for-loop witout을 보여준 튜토리얼이나 강의는 본 적이 없습니다. 가 증가 얻을 것이다 전에사전 증가와 사후 증가 - 루프 속도

for (int i=0; i<array.length; i++) {} 

당신이 POST-증가를 사용하는 경우 는 변수 "i"가, 캐시됩니다! 그러나 이것은 명령이 직접 끝나기 때문에 의미가 없습니다. 첫 번째 루프에서

: 당신이 지금까지 이해하지 않은 경우

for (int i=0; i<array.length; ++i) {} 

, 나는 (내 영어에 대한 SRY) 조금 더 가서 : 제 생각에는

이 더 의미가 있습니다 :

  1. i의 실제 값을 캐시합니다. (참고 : 사이에 이동, 그래서이 일을 아무 이유없이)
  2. 증가 내가
  3. 두 번째 루프에서 앞서

를 이동

  1. 증가 내가 직접
  2. 이동 앞으로.

따라서 두 번째 루프는 품질 손실이없는 경우보다 성능이 좋습니다. 다른 의견?

+1

두 번째 루프의 성능이 더 좋은지 확인하는 유일한 방법은이를 측정하는 것입니다 (어셈블리 코드가 다르게 생성되었다고 가정). 'int'를 사용하면 차이가 나는지 의심 스럽습니다. 일부 반복자 유형으로, 아마. ** 편집 ** 나는 C++을 말하고 있습니다. – juanchopanza

+2

"변수 *가 캐시 될 것입니다 *"라고 말하면 상황에 대한 이해 나 연구를 사용합니까, 아니면 그냥 추측하고 있습니까? –

+6

나는 C++ 태그를 보았지만 사라졌고 Java 만 보았고 Java 용 dup를 게시했습니다. –

답변

6

자바에서는이 수준에서 생각할 점이 없습니다. 자바 런타임은 자바 소스 코드에서 글자 그대로 쓰는 것과는 거리가 멀기 때문에 이런 종류의 추론이 의미를 잃는다. 특히 JIT 컴파일러는 코드를 기계 코드 수준에서 이해할 수 없게 만듭니다.

+0

그래서 어떤 경우에 당신이 그것을 쓰든 상관 없다, 컴파일러는 그것이 속한 것에 그것을 만든다? 나는이 과정에서 나의 학생들에게 가르치고, 포스트 - 그리고 사전 조건은 (내가 선생님이 될지라도) 이것은 "배경 지식"을 가지고 있기 때문에 항상 재미있을 수있다. 그러나 흥미 롭다. 문제가되지 않는다. Thx, 대답 해! :) – codepleb

+0

Java의 Just-In-Time 컴파일러는 이처럼 거의 그림을 입력하지 않는 훨씬 더 복잡한 작업을 수행합니다. 예를 들어 부작용이 없다는 것을 알게되면 전체 * 루프를 지울 수 있습니다. –

+0

정확할 수도 있지만 프로그래밍 논리가 더 적합 할 수 있습니다. "내"방식으로 수행하면 광고가 이해됩니다. 물론, 그것은 중요하지 않을 수도 있습니다,하지만 왜 내가 논리를 쓰면 안된다, 컴파일러는 또한 쓸 것인가? 어쨌든, 좋은 anwser, 그러나 나는 지금하는 일을 바꾸지 않을 것입니다. :) – codepleb