กลับไปหน้าบทความ

อ่าน 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 ซึ่งการขยายมาโครอาจส่งผลให้เกิดนิพจน์ย่อยที่เหมือนกันซึ่งไม่ปรากฏในซอร์สโค้ดดั้งเดิม

คอมไพเลอร์จำเป็นต้องพิจารณาอย่างรอบคอบเกี่ยวกับจำนวนตัวแปรชั่วคราวที่สร้างขึ้นเพื่อเก็บค่า การสร้างค่าชั่วคราวจำนวนมากเกินไปจะทำให้เกิดแรงดันในรีจิสเตอร์ ซึ่งอาจส่งผลให้ ต้องถ่ายโอนข้อมูลจากรีจิสเตอร์ไปยังหน่วยความจำ ซึ่งอาจใช้เวลานานกว่าการคำนวณผลลัพธ์ทางคณิตศาสตร์ใหม่เมื่อจำเป็น

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Common_subexpression_elimination&oldid=1340619280 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ การกำจัดนิพจน์ย่อยทั่วไป

ใน ทฤษฎีคอมไพเลอร์ การ กำจัดนิพจน์ย่อยทั่วไป ( CSE ) เป็นการ เพิ่มประสิทธิภาพคอมไพเลอร์ ที่ค้นหาตัวอย่างของ นิพจน์ ที่เหมือนกัน (กล่าวคือ นิพจน์ทั้งหมดประเมินค่าได้เท่ากัน)...

หลักการ

ความเป็นไปได้ในการดำเนินการ CSE ขึ้นอยู่กับ การวิเคราะห์ นิพจน์ที่มีอยู่ ( การวิเคราะห์การไหลของข้อมูล ) นิพจน์ b*c จะพร้อมใช้งาน ณ จุด p ในโปรแกรมก็ต่อเมื่อ:

ประโยชน์

ประโยชน์ของการดำเนินการ CSE นั้นมีมากมายจนทำให้เป็นวิธีการเพิ่มประสิทธิภาพที่ใช้กันอย่างแพร่หลาย

ดูเพิ่มเติม

การกำหนดหมายเลขค่าทั่วโลก การเคลื่อนรหัสที่ไม่เปลี่ยนแปลงในลูป ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Common_subexpression_elimination&oldid=1340619280 "