변경하지 않고 항상 0 인 함수 A, 함수 F, 함수 G 및 함수 H가있는 최신 인텔 데스크탑 프로세서에서 다음 코드를 호출하면 GCC 최신 버전의 -O3 최적화 :C++ 성능을 설명 할 수 없음
for(i = 0; i < a_big_number; i++)
{
if(A != 0) F();
else G();
}
실행에 2 초가 걸립니다. A는 항상 0이기 때문에 F는 절대로 호출되지 않습니다. 또는
for(i = 0; i < a_big_number; i++)
{
if(A != 0) H();
else G();
}
은 실행에 1 초 밖에 걸리지 않습니다. 다시 A는 항상 0이고 H는 절대로 호출되지 않습니다. 마지막으로
for(i = 0; i < a_big_number; i++)
{
G();
}
은 실행하는 데 0.5 초 밖에 걸리지 않습니다.
처음 두 예제의 조건문이 주어지면 F와 H의 내용이 중요한 이유는 무엇입니까? 그들은 결코 전화를받지 않았기 때문에 왜 그들이하는 일에 변화를 가져 왔을까요? 인텔 프로세서가 정교한 분기 예측을한다고 가정하면 프로세서는 G()가 항상 호출되고 조건문에서 시간을 낭비하지 않는다고 판단해서는 안됩니까? 조건부 학습은 시간을 낭비해야한다는 것을 이해하지만, 왜 그렇게 많은 시간을 낭비하는지 알지 못합니다. 이에
for(i = 0; i < a_big_number; i++)
{
if(A != 0) F();
else G();
}
:
상대적인 성능을 나타내는 완벽하고 단순하며 컴파일 가능한 독립 실행 형 예제를 제공하십시오. 또한 몇 초 내에 실행되는 벤치 마크는 매우 시끄러운 결과를 초래할 가능성이 매우 높으며 성능 차이의 원인을 파악하는 가장 좋은 방법은 종종 생성 된 어셈블리를 보는 것입니다.) –
왜 비교 명령문이 제로 시간이 걸릴까요? GCC가 그것을 최적화하기에 충분한 정보를 가지고 있지 않다면, CPU주기가 진행됩니다. – dasblinkenlight
F, G 또는 H 중 하나가'inline'으로 선언 되었습니까? A가'const'로 선언 되었습니까?이 세 코드 조각은 하나의'main'에 나타 납니까? 후자에 관해서는 캐싱이 일부 성능 차이를 설명 할 수 있습니다. 3 개의 코드 블록을 재정렬하십시오. –