อ่าน 2 นาที
การเคลื่อนไหวของรหัส
ใน วิทยาการคอมพิวเตอร์ การ เคลื่อนย้ายโค้ด ซึ่งรวมถึงการยกโค้ดขึ้น (code hoisting), การลดโค้ดลง (code sinking), การเคลื่อนย้ายโค้ดที่ไม่ขึ้นกับลูป (loop-invariant code motion)...
การเคลื่อนไหวของรหัส
ในวิทยาการคอมพิวเตอร์การเคลื่อนย้ายโค้ดซึ่งรวมถึงการยกโค้ดขึ้น (code hoisting), การลดโค้ดลง (code sinking), การเคลื่อนย้ายโค้ดที่ไม่ขึ้นกับลูป (loop-invariant code motion) และการแยกตัวประกอบโค้ด (code factoring) เป็นคำรวมที่ใช้เรียกกระบวนการใดๆ ที่เคลื่อนย้ายโค้ดภายในโปรแกรม โดยทั่วไปแล้วจะทำเพื่อเพิ่มประสิทธิภาพและลดขนาดโปรแกรม และเป็นการเพิ่มประสิทธิภาพที่พบได้ทั่วไปในคอมไพเลอร์ที่เน้นการเพิ่มประสิทธิภาพ ส่วน ใหญ่
การใช้งาน
การเคลื่อนย้ายโค้ดมีประโยชน์และการใช้งานที่หลากหลาย ซึ่งหลายอย่างก็มีความคล้ายคลึงกันในแง่ของการนำไปใช้งาน
การลบการดำเนินการที่ไม่ได้ใช้/ไร้ประโยชน์

Code sinkingหรือที่รู้จักกันในชื่อlazy code motionเป็นคำที่ใช้เรียกเทคนิคที่ช่วยลดคำสั่งที่สูญเปล่าโดยการย้ายคำสั่งไปยังสาขาที่ใช้คำสั่งนั้น[ 1 ]หากมีการดำเนินการก่อนสาขา และมีเพียงเส้นทางสาขาเดียวที่ใช้ผลลัพธ์ของการดำเนินการนั้น Code sinking จะเกี่ยวข้องกับการย้ายการดำเนินการนั้นไปยังสาขาที่จะใช้
เทคนิคนี้เป็นรูปแบบหนึ่งของการกำจัดโค้ดที่ไม่ได้ใช้งานในแง่ที่ว่ามันจะลบโค้ดเมื่อผลลัพธ์ของโค้ดนั้นถูกทิ้งหรือไม่ได้ใช้งาน แต่แตกต่างจากการกำจัดโค้ดที่ไม่ได้ใช้งานตรงที่มันสามารถลบคำสั่งที่ไม่มีประโยชน์ได้ แม้ว่าผลลัพธ์ของคำสั่งนั้นอาจจะถูกนำไปใช้ในเส้นทางการทำงานของโค้ดก็ตาม
ลดขนาดของโปรแกรมลง

การแยกตัวประกอบโค้ดเป็นคำที่ใช้เรียกเทคนิคการเพิ่มประสิทธิภาพขนาดที่รวมการพึ่งพาที่เหมือนกันในสาขาต่างๆ เข้ากับสาขาด้านบน[ 2 ]เช่นเดียวกับการแยกตัวประกอบจำนวนเต็มที่แยกตัวเลขออกเป็นรูปแบบที่เล็กที่สุดเท่าที่จะเป็นไปได้ (เป็นตัวประกอบ) การแยกตัวประกอบโค้ดจะแปลงโค้ดให้เป็นรูปแบบที่เล็กที่สุดเท่าที่จะเป็นไปได้ โดยการรวม "ตัวประกอบ" ที่เหมือนกันจนกว่าจะไม่มีส่วนที่ซ้ำกันเหลืออยู่
ลดปัญหาการหยุดชะงักเนื่องจากการพึ่งพา

การเคลื่อนย้ายโค้ดทั่วโลกการเคลื่อนย้ายโค้ดเฉพาะที่ การจัดตารางโค้ด การจัดตารางคำสั่ง และการยก/จมโค้ด ล้วนเป็นคำที่ใช้เรียกเทคนิคที่คำสั่งต่างๆ ถูกจัดเรียงใหม่ (หรือ "จัดตาราง") เพื่อปรับปรุงประสิทธิภาพการทำงานภายใน CPU [ 3 ] [ 4 ] CPUสมัยใหม่สามารถจัดตารางคำสั่งได้ห้าคำสั่งขึ้นไปต่อรอบสัญญาณนาฬิกา อย่างไรก็ตาม CPU ไม่สามารถจัดตารางคำสั่งที่ต้องอาศัยข้อมูลจากคำสั่งที่กำลังดำเนินการอยู่ (หรือยังไม่ได้ดำเนินการ) คอมไพเลอร์จะสลับการพึ่งพาในลักษณะที่เพิ่มจำนวนคำสั่งที่ CPU สามารถประมวลผลได้สูงสุดในแต่ละช่วงเวลา[ 5 ]
บนสถาปัตยกรรมIntel Itanium ที่เลิกใช้งานแล้ว คำสั่ง ทำนายการแตกแขนง (BRP) จะถูกยกขึ้นเหนือการแตกแขนงโดยคอมไพเลอร์ด้วยตนเอง เพื่อให้ CPU สามารถดำเนินการแตกแขนงได้ทันที Itanium อาศัยการจัดกำหนดการโค้ดเพิ่มเติมจาก CPU เพื่อเพิ่มประสิทธิภาพสูงสุดในโปรเซสเซอร์[ 6 ]
การเคลื่อนรหัสที่ไม่เปลี่ยนแปลงในลูป

การเคลื่อนย้ายโค้ดที่ไม่เปลี่ยนแปลงในลูป คือกระบวนการย้ายโค้ดที่ไม่เปลี่ยนแปลงในลูปไปยังตำแหน่งภายนอกลูป ซึ่งอาจช่วยลดเวลาในการทำงานของลูปได้ โดยป้องกันไม่ให้มีการคำนวณบางอย่างซ้ำกันเพื่อให้ได้ผลลัพธ์เดียวกัน
ตัวอย่างคอมไพเลอร์
LLVM
LLVMมี pass แบบ sinking ในรูปแบบการกำหนดค่าคงที่แบบเดี่ยว LLVM 15.0 จะไม่ sink การดำเนินการหากเส้นทางโค้ดใดๆ มีคำสั่ง store หรือหากอาจเกิดข้อผิดพลาด[ 7 ]นอกจากนี้ LLVM จะไม่ sink คำสั่งลงในลูป
จีซีซี
GNU Compiler Collectionใช้การย้ายโค้ดภายใต้ชื่อ "code factoring" โดยมีวัตถุประสงค์เพื่อลดขนาดของโปรแกรมที่คอมไพล์แล้ว[ 8 ] GCC จะย้ายโค้ดขึ้นหรือลงหาก "[ไม่] ทำให้การพึ่งพาที่มีอยู่เป็นโมฆะหรือแนะนำการพึ่งพาใหม่" [ 9 ]
ลูอาจิท
LuaJITใช้การจมโค้ดภายใต้ชื่อ "การจมการจัดสรร" เพื่อลดปริมาณเวลาที่โค้ดที่คอมไพล์ใช้ในการจัดสรรและรวบรวมวัตถุชั่วคราวภายในลูป[ 10 ]การจมการจัดสรรจะย้ายการจัดสรรไปยังเส้นทางการดำเนินการที่วัตถุที่จัดสรรอาจหลุดออกจากโค้ดที่กำลังทำงานอยู่ และจะต้องใช้การจัดสรรฮีปการจัดสรรที่ถูกลบทั้งหมดจะถูกเติมเต็มด้วยการส่งต่อการโหลดไปยังที่เก็บข้อมูลผ่านฟิลด์ของพวกมัน[ 11 ]
ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ การเคลื่อนไหวของรหัส
ใน วิทยาการคอมพิวเตอร์ การ เคลื่อนย้ายโค้ด ซึ่งรวมถึงการยกโค้ดขึ้น (code hoisting), การลดโค้ดลง (code sinking), การเคลื่อนย้ายโค้ดที่ไม่ขึ้นกับลูป (loop-invariant code motion)...
การใช้งาน
การเคลื่อนย้ายโค้ดมีประโยชน์และการใช้งานที่หลากหลาย ซึ่งหลายอย่างก็มีความคล้ายคลึงกันในแง่ของการนำไปใช้งาน
การลบการดำเนินการที่ไม่ได้ใช้/ไร้ประโยชน์
Code sinking หรือที่รู้จักกันในชื่อ lazy code motion เป็นคำที่ใช้เรียกเทคนิคที่ช่วยลดคำสั่งที่สูญเปล่าโดยการย้ายคำสั่งไปยังสาขาที่ใช้คำสั่งนั้น [ 1 ] หากมีการดำเนินการก่อนสาขา และมีเพียงเส้นทางสาขาเดียวที่ใช้ผลลัพธ์ของการดำเนินการนั้น Code sinking...
ลดขนาดของโปรแกรมลง
การแยกตัวประกอบโค้ด เป็นคำที่ใช้เรียกเทคนิคการเพิ่มประสิทธิภาพขนาดที่รวมการพึ่งพาที่เหมือนกันในสาขาต่างๆ เข้ากับสาขาด้านบน [ 2 ] เช่นเดียวกับ การแยกตัวประกอบจำนวนเต็มที่ แยกตัวเลขออกเป็นรูปแบบที่เล็กที่สุดเท่าที่จะเป็นไปได้ (เป็นตัวประกอบ)...