คอมไพเลอร์จะนำโค้ดของคุณมาแยกเป็นคำแนะนำง่ายๆจากนั้นจึงรวมกันใหม่และจัดเรียงตามที่คิดว่าเหมาะสมที่สุด
รหัส
int i = 1;
int x = ++i + ++i;
ประกอบด้วยคำแนะนำต่อไปนี้:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
5. read i as tmp2
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
9. read i as tmp4
10. add tmp2 and tmp4, as tmp5
11. store tmp5 in x
แต่ถึงแม้จะเป็นรายการลำดับเลขตามที่ฉันเขียน แต่ก็มีการอ้างอิงการสั่งซื้อเพียงไม่กี่รายการที่นี่: 1-> 2-> 3-> 4-> 5-> 10-> 11 และ 1-> 6-> 7- > 8-> 9-> 10-> 11 ต้องอยู่ตามลำดับญาติ นอกเหนือจากนั้นคอมไพลเลอร์สามารถจัดลำดับใหม่ได้อย่างอิสระและอาจกำจัดความซ้ำซ้อน
ตัวอย่างเช่นคุณสามารถจัดลำดับรายการดังนี้:
1. store 1 in i
2. read i as tmp1
6. read i as tmp3
3. add 1 to tmp1
7. add 1 to tmp3
4. store tmp1 in i
8. store tmp3 in i
5. read i as tmp2
9. read i as tmp4
10. add tmp2 and tmp4, as tmp5
11. store tmp5 in x
ทำไมคอมไพเลอร์ถึงทำเช่นนี้ได้? เนื่องจากไม่มีการจัดลำดับผลข้างเคียงของการเพิ่มขึ้น แต่ตอนนี้คอมไพเลอร์สามารถทำให้ง่ายขึ้น: ตัวอย่างเช่นมีร้านค้าที่ตายแล้วใน 4: ค่าจะถูกเขียนทับทันที นอกจากนี้ tmp2 และ tmp4 ก็เหมือนกัน
1. store 1 in i
2. read i as tmp1
6. read i as tmp3
3. add 1 to tmp1
7. add 1 to tmp3
8. store tmp3 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
และตอนนี้ทุกอย่างที่เกี่ยวข้องกับ tmp1 เป็นรหัสตาย: ไม่เคยใช้ และการอ่านซ้ำของฉันก็สามารถกำจัดได้เช่นกัน:
1. store 1 in i
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
10. add tmp3 and tmp3, as tmp5
11. store tmp5 in x
ดูรหัสนี้จะสั้นกว่ามาก เครื่องมือเพิ่มประสิทธิภาพมีความสุข โปรแกรมเมอร์ไม่ได้เป็นเพราะฉันเพิ่มขึ้นเพียงครั้งเดียว อ๊ะ.
ลองดูอย่างอื่นที่คอมไพเลอร์สามารถทำได้แทน: กลับไปใช้เวอร์ชันดั้งเดิมกันเถอะ
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
5. read i as tmp2
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
9. read i as tmp4
10. add tmp2 and tmp4, as tmp5
11. store tmp5 in x
คอมไพเลอร์สามารถจัดลำดับใหม่ได้ดังนี้:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
5. read i as tmp2
9. read i as tmp4
10. add tmp2 and tmp4, as tmp5
11. store tmp5 in x
แล้วสังเกตอีกครั้งว่าฉันอ่านสองครั้งดังนั้นให้กำจัดหนึ่งในนั้น:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
6. read i as tmp3
7. add 1 to tmp3
8. store tmp3 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
เป็นสิ่งที่ดี แต่สามารถไปได้ไกลกว่านี้: สามารถใช้ tmp1 ซ้ำได้:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
6. read i as tmp1
7. add 1 to tmp1
8. store tmp1 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
จากนั้นสามารถกำจัดการอ่านซ้ำของ i ใน 6:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
4. store tmp1 in i
7. add 1 to tmp1
8. store tmp1 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
ตอนนี้ 4 เป็นร้านค้าที่ตายแล้ว:
1. store 1 in i
2. read i as tmp1
3. add 1 to tmp1
7. add 1 to tmp1
8. store tmp1 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
และตอนนี้ 3 และ 7 สามารถรวมเป็นคำสั่งเดียว:
1. store 1 in i
2. read i as tmp1
3+7. add 2 to tmp1
8. store tmp1 in i
5. read i as tmp2
10. add tmp2 and tmp2, as tmp5
11. store tmp5 in x
กำจัดชั่วคราวสุดท้าย:
1. store 1 in i
2. read i as tmp1
3+7. add 2 to tmp1
8. store tmp1 in i
10. add tmp1 and tmp1, as tmp5
11. store tmp5 in x
และตอนนี้คุณได้รับผลลัพธ์ที่ Visual C ++ มอบให้คุณแล้ว
โปรดทราบว่าในทั้งสองเส้นทางการเพิ่มประสิทธิภาพการอ้างอิงลำดับที่สำคัญจะถูกเก็บรักษาไว้ตราบเท่าที่คำแนะนำไม่ได้ถูกลบออกเพื่อไม่ทำอะไรเลย