이것은 질문에 대한 Mysticial 의 훌륭한 답변을 읽는 동안 염두에 두었던 질문입니다. 정렬되지 않은 배열보다 정렬 된 배열을 처리하는 것이 왜 더 빠릅 니까?
관련된 유형에 대한 컨텍스트 :
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
그의 대답에서 그는 인텔 컴파일러 (ICC)가 이것을 최적화한다고 설명합니다.
for (int i = 0; i < 100000; ++i)
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += data[c];
... 이와 동등한 것으로 :
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
for (int i = 0; i < 100000; ++i)
sum += data[c];
옵티마이 저는 이들이 동등 함을 인식 하고 루프를 교환 하여 분기를 내부 루프 밖으로 이동시킵니다. 매우 영리한!
그러나 왜 그렇지 않습니까?
for (int c = 0; c < arraySize; ++c)
if (data[c] >= 128)
sum += 100000 * data[c];
바라건대 Mysticial (또는 다른 사람)도 똑같이 훌륭한 답변을 줄 수 있습니다. 나는 이전에 다른 질문에서 논의 된 최적화에 대해 배운 적이 없으므로 정말 감사합니다.
volatile
인 경우 루프 교환도 잘못된 최적화입니다.