मैं हाल ही में एक व्यक्तिगत परियोजना पर काम कर रहा था जब मैं एक विषम मुद्दे पर ठोकर खाई।
बहुत तंग लूप में मेरे पास 0 और 15. के बीच के मान के साथ एक पूर्णांक है। मुझे मान 0, 1, 8, और 9 के लिए -1 और मान 4, 5, 12 और 13 के लिए 1 प्राप्त करने की आवश्यकता है।
मैं कुछ विकल्पों की जाँच करने के लिए गॉडबोल्ट की ओर मुड़ गया और आश्चर्यचकित था कि ऐसा लग रहा था कि कंपाइलर एक स्विच स्टेटमेंट को उसी तरह से ऑप्टिमाइज़ नहीं कर सकता, जैसे कि एक चेन।
लिंक यहाँ है: 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
लक्ष्य हार्डवेयर आधार पर ।
क्या कोई समझा सकता है कि यह विसंगति क्यों है? इस क्वेरी को ऑप्टिमाइज़ करने का 'सही' तरीका क्या है?
संपादित करें:
स्पष्टीकरण
मैं चाहता हूं कि स्विच समाधान सबसे तेज़, या इसी तरह "स्वच्छ" समाधान हो। हालांकि जब मेरी मशीन पर अनुकूलन के साथ संकलित किया जाता है यदि समाधान काफी तेज होता है।
मैंने प्रदर्शित करने के लिए एक त्वरित कार्यक्रम लिखा और टीआईओ के पास वही परिणाम हैं जो मुझे स्थानीय रूप से मिलते हैं: इसे ऑनलाइन आज़माएं!
साथ static inline
लुकअप तालिका थोड़ा गति: यह ऑनलाइन कोशिश करो!
if
भी धड़कता है switch
(अजीब तरह से देखने के बाद भी तेज हो जाता है) [TIO का अनुसरण करने के लिए]
-O3
संकलित किया, और यहc
किसी चीज़ से खराब होने की संभावना के साथ संकलित किया था (a
या दो सशर्त कूदता है और कुछ बिट जोड़तोड़, बनाम केवल एक सशर्त कूद और सरल बिट हेरफेर के लिए ), लेकिन अभी भी आइटम परीक्षणों द्वारा भोली वस्तु से बेहतर है। मुझे यकीन नहीं है कि आप वास्तव में यहाँ क्या माँग रहे हैं; साधारण तथ्य यह है कि एक अनुकूलन संकलक बदल सकते है किसी भी में इनमें से किसी भी अन्य लोगों की अगर वह चयन करता तो है, और वहाँ यह या काम नहीं चलेगा कि क्या के लिए कोई निर्धारित नियम और कानून हैं।b
c
b