ฉันกำลังทำงานในโครงการส่วนบุคคลเมื่อเร็ว ๆ นี้เมื่อฉันเจอปัญหาแปลก ๆ
ในวงที่แน่นมากฉันมีจำนวนเต็มที่มีค่าระหว่าง 0 ถึง 15 ฉันต้องได้รับ -1 สำหรับค่า 0, 1, 8, และ 9 และ 1 สำหรับค่า 4, 5, 12, และ 13
ฉันหันไปใช้ godbolt เพื่อตรวจสอบตัวเลือกสองสามตัวและรู้สึกประหลาดใจที่ดูเหมือนว่าคอมไพเลอร์ไม่สามารถปรับคำสั่งสวิตช์ให้เหมาะสมเช่นเดียวกับโซ่ถ้า
ลิงก์อยู่ที่นี่: https://godbolt.org/z/WYVBFl
รหัสคือ:
const int lookup[16] = {-1, -1, 0, 0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0};
int a(int num) {
return lookup[num & 0xF];
}
int b(int num) {
num &= 0xF;
if (num == 0 || num == 1 || num == 8 || num == 9)
return -1;
if (num == 4 || num == 5 || num == 12 || num == 13)
return 1;
return 0;
}
int c(int num) {
num &= 0xF;
switch (num) {
case 0: case 1: case 8: case 9:
return -1;
case 4: case 5: case 12: case 13:
return 1;
default:
return 0;
}
}
ฉันคิดว่า b และ c จะให้ผลลัพธ์ที่เหมือนกันและฉันหวังว่าฉันจะอ่านบิตแฮ็คเพื่อให้เกิดการใช้งานที่มีประสิทธิภาพด้วยตัวเองตั้งแต่โซลูชัน (คำสั่งสวิตช์ - ในรูปแบบอื่น) ค่อนข้างช้า
ผิดปกติb
เรียบเรียงเป็นบิต - แฮ็กในขณะที่c
ทั้งสวยมากไม่ได้รับการเพิ่มประสิทธิภาพหรือลดลงเป็นกรณีที่แตกต่างกันa
ขึ้นอยู่กับฮาร์ดแวร์เป้าหมาย
ใครช่วยอธิบายได้ว่าทำไมถึงมีความคลาดเคลื่อนนี้? วิธี 'ถูกต้อง' ในการเพิ่มประสิทธิภาพข้อความค้นหานี้คืออะไร
แก้ไข:
การอธิบาย
ฉันต้องการโซลูชันสวิตช์ให้เร็วที่สุดหรือโซลูชัน "สะอาด" ในทำนองเดียวกัน อย่างไรก็ตามเมื่อรวบรวมกับการเพิ่มประสิทธิภาพในเครื่องของฉันถ้าวิธีการแก้ปัญหาได้เร็วขึ้นอย่างมีนัยสำคัญ
ฉันเขียนโปรแกรมด่วนเพื่อสาธิตและ TIO มีผลลัพธ์เช่นเดียวกับที่พบในท้องถิ่น: ลองออนไลน์!
ด้วยตารางstatic inline
การค้นหาความเร็วเพิ่มขึ้นเล็กน้อย: ลองออนไลน์!
if
ยังคงเต้นswitch
(การค้นหาที่แปลกประหลาดยิ่งเร็วขึ้น) [TIO ที่จะติดตาม]
-O3
และจะรวบรวมc
เพื่อสิ่งที่น่าจะเลวร้ายยิ่งกว่าa
หรือb
(c
มีสองเงื่อนไขกระโดดบวกกิจวัตรบิตไม่กี่เทียบกับเพียงหนึ่งกระโดดเงื่อนไขและ Manip บิตง่ายสำหรับb
) แต่ยังคง ดีกว่ารายการที่ไร้เดียงสาโดยการทดสอบรายการ ฉันไม่แน่ใจว่าคุณขออะไรที่นี่จริง ๆ ; ความจริงง่ายๆก็คือการเพิ่มประสิทธิภาพคอมไพเลอร์สามารถเปิดใด ๆของเหล่านี้เข้าไปในใด ๆของคนอื่น ๆ ถ้าต้องการและไม่มีกฎอย่างหนักและรวดเร็วสำหรับสิ่งที่มันจะหรือจะไม่ทำ