อะไรคือคำศัพท์สำหรับการฟื้นฟูสภาพประเภทนี้


33

ฉันแน่ใจว่ามีคำศัพท์สำหรับการรีแฟคเตอร์ต่อไปนี้ แต่ฉันจำไม่ได้และ Google-fu ของฉันกำลังทำให้ฉันล้มเหลว!

refactor จะย้ายถ้าข้อความไปยังตำแหน่งที่พวกเขาจะได้รับผลกระทบมากที่สุดเช่นการเปลี่ยนแปลง

$test = someFunctionThatReturnsABool();
for($x = 0; $x < 10000; $x++) {
    if ($test) { 
        echo $x; 
    }
}

สำหรับสิ่งนี้

$test = someFunctionThatReturnsABool();
if ($test) {
    for($x = 0; $x < 10000; $x++) {
        echo $x; 
    }
}

คำตอบ:


56

นี้เป็นห่วงคงเคลื่อนไหวรหัส คอมไพเลอร์ที่ดีควรทำด้วยตัวเอง

... รหัส loop-invariantประกอบด้วยข้อความหรือนิพจน์ (ในภาษาการเขียนโปรแกรมที่จำเป็น ) ซึ่งสามารถเคลื่อนย้ายได้นอกร่างกายของลูปโดยไม่ส่งผลกระทบต่อซีแมนทิกส์ของโปรแกรม การเคลื่อนที่ของรหัสแบบวนรอบไม่หยุดหย่อน (เรียกอีกอย่างว่าhoistingหรือการเลื่อนระดับสเกลาร์ ) เป็นการเพิ่มประสิทธิภาพของคอมไพเลอร์ซึ่งทำการเคลื่อนไหวนี้โดยอัตโนมัติ ...

หากเราพิจารณาตัวอย่างโค้ดต่อไปนี้การปรับให้เหมาะสมสองแบบสามารถทำได้อย่างง่ายดาย

for (int i = 0; i < n; i++) {
    x = y + z;
    a[i] = 6 * i + x * x;
}

การคำนวณx = y + zและx * xสามารถเคลื่อนย้ายได้นอกลูปเนื่องจากภายในเป็นลูปค่าคงที่ - พวกมันจะไม่เปลี่ยนแปลงในการวนซ้ำของลูป - ดังนั้นโค้ดที่ปรับให้เหมาะสมจะมีลักษณะดังนี้:

x = y + z;
t1 = x * x;
for (int i = 0; i < n; i++) {
    a[i] = 6 * i + t1;
}

รหัสนี้สามารถปรับให้เหมาะสมต่อไป ...


55
เป็นโปรแกรมเมอร์ที่ดีควรทำมันเป็นของตัวเองเช่นกันผมคิดว่า
Stijn

8
ฉันเห็นด้วย @stijn - มีบางสิ่งที่มันสมเหตุสมผลที่จะให้คอมไพเลอร์กังวล แต่นี่ไม่ใช่หนึ่งในนั้น!
Toby

@Toby: ในขณะนี้เป็นจริงสำหรับรหัสใหม่ (หลังจากทั้งหมดย้ายวนคงที่ทำให้การวนรอบภายในเข้าใจง่ายขึ้น) สิ่งที่ทำโดยคอมไพเลอร์ไม่จำเป็นต้องทำด้วยมือ ฉันแค่ปล่อยให้รหัสเก่าเช่นตัวอย่างข้างต้นยืน; การปรับปรุงคุณภาพของ LICM นั้นมีขนาดเล็กและอาจไม่คุ้มค่ากับเวลาของคุณ
thiton

12
@ ฉันไม่เห็นด้วย การปล่อยให้เป็นไปตามนั้นจะหมายถึงผู้ดูแลในอนาคตทั้งหมดจะต้องผ่านการใช้เหตุผลเดียวกัน มันเสียเวลา แค่เปลี่ยนมัน
Izkata

2
@zzzzBov ใช่ฉันรู้ แต่ประเด็นของฉันคือเมื่อซ่อนรูปแบบอาจเป็นไปไม่ได้อีกต่อไป หรืออะไรทำนองนั้น (ขออภัยเป็นวันที่ยาวนาน)
stijn

10

นี้จะเรียกว่าหรือhoisting scalar promotionดูที่นี่ :

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

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

int a = x;
int b = y;


0

ฉันไม่คิดว่าการปรับโครงสร้างดังกล่าวมีอยู่จริง

ดังนั้นจึงเป็นเรื่องยากที่จะหามันในรายการ 'การปรับโครงสร้าง' '

ฉันจะยกตัวอย่างว่าเป็นการเพิ่มประสิทธิภาพไม่ใช่การปรับโครงสร้างใหม่

สำหรับฉัน Refactoring กำลังเปลี่ยนรหัสเพื่อปรับปรุงความเข้าใจโดยไม่ส่งผลกระทบต่อพฤติกรรมของมัน

การปรับให้เหมาะสมกับฉันกำลังเปลี่ยนรหัสเพื่อปรับปรุงประสิทธิภาพ

เนื่องจากโค้ดที่ปรับให้เหมาะสมนั้นมีแนวโน้มที่จะเข้าใจได้ง่ายน้อยลง การปฏิบัติทั้งสองมีแนวโน้มที่จะทำงานร่วมกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.