มีสองวิธีที่รู้จักกันดีในการตั้งค่าการลงทะเบียนจำนวนเต็มให้เป็นค่าศูนย์บน x86
ทั้ง
mov reg, 0
or
xor reg, reg
มีความเห็นว่าตัวแปรที่สองจะดีกว่าเนื่องจากค่า 0 ไม่ได้ถูกเก็บไว้ในโค้ด และจะบันทึกโค้ดเครื่องที่ผลิตได้หลายไบต์ นี่เป็นสิ่งที่ดีอย่างแน่นอน - ใช้แคชคำสั่งน้อยลง และบางครั้งอาจทำให้การรันโค้ดเร็วขึ้น คอมไพเลอร์จำนวนมากสร้างโค้ดดังกล่าว
อย่างไรก็ตาม มีการพึ่งพาคำสั่งระหว่างคำสั่งอย่างเป็นทางการระหว่างคำสั่ง xor และคำสั่งก่อนหน้าใดก็ตามที่เปลี่ยนรีจิสเตอร์เดียวกัน เนื่องจากมีการพึ่งพา คำสั่งหลังจึงต้องรอจนกว่าคำสั่งแรกจะเสร็จสมบูรณ์ และอาจลดภาระของหน่วยประมวลผลและทำให้ประสิทธิภาพลดลง
add reg, 17
;do something else with reg here
xor reg, reg
เห็นได้ชัดว่าผลลัพธ์ของ xor จะเหมือนกันทุกประการโดยไม่คำนึงถึงค่ารีจิสเตอร์เริ่มต้น แต่โปรเซสเซอร์สามารถรับรู้สิ่งนี้ได้หรือไม่?
ฉันลองทดสอบต่อไปนี้ใน VC++7:
const int Count = 10 * 1000 * 1000 * 1000;
int _tmain(int argc, _TCHAR* argv[])
{
int i;
DWORD start = GetTickCount();
for( i = 0; i < Count ; i++ ) {
__asm {
mov eax, 10
xor eax, eax
};
}
DWORD diff = GetTickCount() - start;
start = GetTickCount();
for( i = 0; i < Count ; i++ ) {
__asm {
mov eax, 10
mov eax, 0
};
}
diff = GetTickCount() - start;
return 0;
}
ด้วยการเพิ่มประสิทธิภาพของทั้งสองลูปจะใช้เวลาเท่ากันทุกประการ นี่เป็นการพิสูจน์อย่างสมเหตุสมผลหรือไม่ว่าโปรเซสเซอร์รับรู้ว่าไม่มีการพึ่งพาคำสั่ง xor reg, reg
กับคำสั่ง mov eax, 0
ก่อนหน้าหรือไม่ อะไรจะเป็นการทดสอบที่ดีกว่าในการตรวจสอบสิ่งนี้
xor reg, reg
แบบเก่า - สมัยก่อนที่ดี :) - person Nick Dandoulakis   schedule 16.07.2009Count
ของคุณล้น ดังนั้นลูปจะทำงานน้อยกว่าที่คุณคาดไว้มาก - person phuclv   schedule 06.12.2013xor reg,reg
ไม่จำเป็นต้องมีหน่วยดำเนินการ (จัดการด้วยการถอดรหัส?) มันทำลายการพึ่งพาในreg
และแผงลอยอัปเดตสถานะบางส่วน และมีการเข้ารหัสที่เล็กกว่า ไม่มีเหตุผลที่ดีสำหรับแนวทางmov
ใน x86-64 ล่าสุด เว้นแต่ว่าคุณจะต้องรักษาสถานะ [e] ไว้ - person Brett Hale   schedule 10.02.2014xor
เมื่อเปรียบเทียบกับmov
ฉันเขียนคำตอบสำหรับคำถามล่าสุดก่อนที่จะเห็นคำถามนี้: stackoverflow.com/questions/33666617/ . ฉันคิดว่ามันเป็นคำตอบที่ดีและสมบูรณ์มากกว่าคำตอบเหล่านี้ ตามหลักการแล้วควรทำเครื่องหมายว่าซ้ำกัน - person Peter Cordes   schedule 19.01.2016