อ่าน 2 นาที
การกำจัดนิพจน์ย่อยทั่วไป
ใน ทฤษฎีคอมไพเลอร์ การ กำจัดนิพจน์ย่อยทั่วไป ( CSE ) เป็นการ เพิ่มประสิทธิภาพคอมไพเลอร์ ที่ค้นหาตัวอย่างของ นิพจน์ ที่เหมือนกัน (กล่าวคือ นิพจน์ทั้งหมดประเมินค่าได้เท่ากัน)...
การกำจัดนิพจน์ย่อยทั่วไป
ในทฤษฎีคอมไพเลอร์การกำจัดนิพจน์ย่อยทั่วไป ( CSE ) เป็นการเพิ่มประสิทธิภาพคอมไพเลอร์ที่ค้นหาตัวอย่างของนิพจน์ ที่เหมือนกัน (กล่าวคือ นิพจน์ทั้งหมดประเมินค่าได้เท่ากัน) และวิเคราะห์ว่าคุ้มค่าหรือไม่ที่จะแทนที่นิพจน์เหล่านั้นด้วยตัวแปรเดียวที่เก็บค่าที่คำนวณได้[ 1 ]
ตัวอย่าง
ในโค้ดต่อไปนี้:
a = b * c + g; d = b * c * e;
อาจคุ้มค่าที่จะปรับเปลี่ยนโค้ดเป็นดังนี้:
tmp = b * c; a = tmp + g; d = tmp * e;
หากค่าใช้จ่ายในการจัดเก็บและเรียกใช้ข้อมูลtmpน้อยกว่าค่าใช้จ่ายในการคำนวณb * cเวลาเพิ่มเติม
หลักการ
ความเป็นไปได้ในการดำเนินการ CSE ขึ้นอยู่กับ การวิเคราะห์ นิพจน์ที่มีอยู่ ( การวิเคราะห์การไหลของข้อมูล ) นิพจน์b*cจะพร้อมใช้งาน ณ จุดpในโปรแกรมก็ต่อเมื่อ:
- ทุกเส้นทางจากโหนดเริ่มต้นไปยัง p จะถูกประเมิน ก่อนที่ จะ
b*cถึงp - และไม่มีการมอบหมายงานใดๆ ก่อน
bหรือcหลังการประเมิน แต่ก่อนหน้าp
การวิเคราะห์ต้นทุน/ผลประโยชน์ที่ดำเนินการโดยโปรแกรมเพิ่มประสิทธิภาพจะคำนวณว่าต้นทุนของการจัดเก็บข้อมูลนั้นtmpน้อยกว่าต้นทุนของการคูณหรือไม่ ในทางปฏิบัติ ปัจจัยอื่นๆ เช่น ค่าใดถูกเก็บไว้ในรีจิสเตอร์ใด ก็มีความสำคัญเช่นกัน
ผู้เขียนคอมไพเลอร์จำแนก CSE ออกเป็นสองประเภท:
- การกำจัดนิพจน์ย่อยร่วมในระดับท้องถิ่นทำงานภายในบล็อกพื้นฐาน เดียว
- การกำจัดนิพจน์ย่อยทั่วไปทั่วโลกทำงานกับกระบวนการทั้งหมด
ทั้งสองประเภทอาศัยการวิเคราะห์การไหลของข้อมูล เพื่อตรวจสอบ ว่านิพจน์ใดบ้างที่สามารถใช้งานได้ในจุดใดบ้างของโปรแกรม
ประโยชน์
ประโยชน์ของการดำเนินการ CSE นั้นมีมากมายจนทำให้เป็นวิธีการเพิ่มประสิทธิภาพที่ใช้กันอย่างแพร่หลาย
ในกรณีง่ายๆ เช่นในตัวอย่างข้างต้น โปรแกรมเมอร์อาจกำจัดนิพจน์ที่ซ้ำ กันด้วยตนเอง ขณะเขียนโค้ด แหล่งที่มาหลักของ CSE คือลำดับโค้ดระดับกลางที่สร้างโดยคอมไพเลอร์ เช่น สำหรับ การคำนวณดัชนี อาร์เรย์ซึ่งนักพัฒนาไม่สามารถเข้าไปแทรกแซงด้วยตนเองได้ ในบางกรณี คุณสมบัติของภาษาอาจสร้างนิพจน์ที่ซ้ำกันจำนวนมาก ตัวอย่างเช่นมาโครในภาษา C ซึ่งการขยายมาโครอาจส่งผลให้เกิดนิพจน์ย่อยที่เหมือนกันซึ่งไม่ปรากฏในซอร์สโค้ดดั้งเดิม
คอมไพเลอร์จำเป็นต้องพิจารณาอย่างรอบคอบเกี่ยวกับจำนวนตัวแปรชั่วคราวที่สร้างขึ้นเพื่อเก็บค่า การสร้างค่าชั่วคราวจำนวนมากเกินไปจะทำให้เกิดแรงดันในรีจิสเตอร์ ซึ่งอาจส่งผลให้ ต้องถ่ายโอนข้อมูลจากรีจิสเตอร์ไปยังหน่วยความจำ ซึ่งอาจใช้เวลานานกว่าการคำนวณผลลัพธ์ทางคณิตศาสตร์ใหม่เมื่อจำเป็น
ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การกำจัดนิพจน์ย่อยทั่วไป
ใน ทฤษฎีคอมไพเลอร์ การ กำจัดนิพจน์ย่อยทั่วไป ( CSE ) เป็นการ เพิ่มประสิทธิภาพคอมไพเลอร์ ที่ค้นหาตัวอย่างของ นิพจน์ ที่เหมือนกัน (กล่าวคือ นิพจน์ทั้งหมดประเมินค่าได้เท่ากัน)...
หลักการ
ความเป็นไปได้ในการดำเนินการ CSE ขึ้นอยู่กับ การวิเคราะห์ นิพจน์ที่มีอยู่ ( การวิเคราะห์การไหลของข้อมูล ) นิพจน์ b*c จะพร้อมใช้งาน ณ จุด p ในโปรแกรมก็ต่อเมื่อ:
ประโยชน์
ประโยชน์ของการดำเนินการ CSE นั้นมีมากมายจนทำให้เป็นวิธีการเพิ่มประสิทธิภาพที่ใช้กันอย่างแพร่หลาย
ดูเพิ่มเติม
การกำหนดหมายเลขค่าทั่วโลก การเคลื่อนรหัสที่ไม่เปลี่ยนแปลงในลูป ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Common_subexpression_elimination&oldid=1340619280 "