นี่คือคำถามที่มาถึงใจในขณะที่อ่านคำตอบที่ยอดเยี่ยมโดยMysticialคำถาม: ทำไมมันเร็วขึ้นในการประมวลผลอาร์เรย์เรียงกว่าอาร์เรย์ไม่ได้เรียงลำดับ ?
บริบทสำหรับประเภทที่เกี่ยวข้อง:
const unsigned arraySize = 32768;
int data[arraySize];
long long sum = 0;
ในคำตอบของเขาเขาอธิบายว่า Intel Compiler (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 (หรือใครก็ได้) สามารถให้คำตอบที่ยอดเยี่ยมไม่แพ้กัน ฉันไม่เคยเรียนรู้เกี่ยวกับการเพิ่มประสิทธิภาพที่กล่าวถึงในคำถามอื่น ๆ มาก่อนดังนั้นฉันจึงรู้สึกขอบคุณมากสำหรับสิ่งนี้