2014-12-05 4 views
4

무거운 계산이 루프의 조건부에있는 경우 런타임에 차이가 있습니까? 예를 들어무거운 계산 함수가 루프의 조건부에있는 경우 런타임에 차이가 있습니까?

:

int i,n; 
for(i=1;i<=[call to some complex function on n];i++) 
... 

또는 더 효율적인 하나

int i,n,foo; 
foo=[call to some complex function on n]; 
for(i=1;i<=foo;i++) 
... 

? 루프는 계산을 한 번 또는 반복 할 때마다 수행합니까?

+1

루프는 첫 번째 예에서 매번 표현식을 평가합니다. – kingdamian42

+0

저는이 주제에 대한 전문가는 아니지만, 상수가 아니기 때문에 조건에서 사용하는 것이 더 느립니다 (컴파일 타임을 계산할 수 없다). 어떤 변수와 관련이 있다면 매번 다시 평가해야합니다. – Pietu1998

+0

@ Pietu1998 그렇다면 컴파일 후 n 값을 입력하면 아무런 차이가 없을 것입니다. – shinzou

답변

6

예, 루프 의 조건부에 제공된 함수에 대해 "성능 저하"가 발생합니다. 함수가 const이고 컴파일러가 상수 값으로 줄일 수없는 경우가 아니면. 컴파일러는 매 반복마다 함수를 호출해야합니다.

루프를 시작하기 전에 함수의 결과를 상수 임시 변수에 배치하는 것이 좋습니다.

예 : 그

:-) 공통 분모 충고하지만, 추론 그것에 대해 논리적으로 코드 생성의 관점에서 :

경우]

const unsigned int limit = my_vector.size(); 
for (unsigned int i = 0; i < limit; ++i) 
{ 
    // iterate over vector 
} 
+0

이것에 동의하지만, 고려해야 할 또 다른 측면이 있습니다. 특정 STL 컨테이너에는 O (1) 크기() 메서드가 없습니다. 그 (것)들을 위해, 크기()가 루프의 앞에 가져와 저장해달라고하는 것은, 다만 정당한 가지고 있기에 반대로 거의 의무적으로된다. – KalyanS

1

그것은 측정하는 것이 가장 좋습니다 관계형 표현식의 두 번째 피연산자는 컴파일러에서 루프 불변 식으로 식별 할 수 있으므로 코드 이동을 안전하게 수행 할 수 있습니다. 수동으로 해본 것처럼 모든 이점을 얻을 수 있습니다.

루프 불변 코드 식별에 국한되지 등 일부 제약, 적용됩니다

  1. 루프 지수 자체는 표현에 참여하지 않습니다.
  2. 일반적으로 어떤 포인터도 추론 할 수 없으므로 컴파일러에서 벗어날 수 있습니다.
  3. 표현식에 루프 본문 내에서 "def"변수가 포함되는 경우 해당 코드는 반복되지 않습니다.

포인트 # 1 및 # 3은 수동으로 이동할 수있는 경우 적용 할 수 없습니다. 데이터 종속성이 없음을 의미합니다.

성능 차이는 비용에 따라 다릅니다. 루프에서 조건 표현식으로 인해 누군가 실수로 알고리즘 O (n^2)를 만든 코드 검토를 보았습니다.

당신이주의를 기울이는 것이 좋습니다.

관련 문제