2009-05-26 22 views
24

परिवर्तनीय x संभावित मानों के साथ int है: -1, 0, 1, 2, 3। जो अभिव्यक्ति तेजी से हो जाएगा (सीपीयू टिक्स में):तेज क्या है (x <0) या (x == -1)?

1. (x < 0) 
2. (x == -1) 

भाषा: C/C++, लेकिन मुझे लगता है कि अन्य सभी भाषाओं में एक ही होगा।

पीएस मैं व्यक्तिगत रूप से सोचता हूं कि उत्तर (x < 0) है।

गुरुओं के लिए अधिक व्यापक रूप से: -1 से 2^30 से क्या होगा?

+8

इतनी कम स्तर विचार में उत्तर देने के लिए, सीपीयू वास्तुकला की जानकारी का एक न्यूनतम टुकड़ा हो सकता है, आपको नहीं लगता कि? लेकिन फिर भी, एक सीपीयू जिसे उन परिस्थितियों के लिए विभिन्न चक्रों की आवश्यकता होती है वह बहुत प्राचीन होगी। – joelr

+2

किसी भी उचित आधुनिक सीपीयू (पिछले दशक या उससे भी अधिक) में, मुझे आश्चर्य होगा कि अगर 32-बिट पूर्णांक तुलना एक से अधिक चक्र लेती है। – Eddie

+16

यह एक बुरा सवाल क्यों है? प्रोसेसर कैसे काम करते हैं और इस तरह की चीजों के बारे में एक बेहतर समझ के साथ जुड़े सभी का एक संपूर्ण जवाब। क्या यह अच्छी बात नहीं है? –

उत्तर

77

कि ईसा आप के लिए संकलित कर रहे हैं पर निर्भर करता है, और अपने संकलक के अनुकूलक की गुणवत्ता। समय-समय पर अनुकूलित न करें: अपनी बाधाओं को खोजने के लिए पहले प्रोफ़ाइल

ने कहा कि, x86 में, आप पाएंगे कि ज्यादातर मामलों में दोनों समान रूप से तेज़ हैं। दोनों मामलों में, आपके पास तुलना (cmp) और एक सशर्त कूद (jCC) निर्देश होंगे। हालांकि, (x < 0) के लिए, ऐसे कुछ उदाहरण हो सकते हैं जहां संकलक cmp निर्देश को बढ़ा सकता है, द्वारा एक संपूर्ण चक्र तक अपना कोड बढ़ा सकता है।

विशेष रूप से, यदि मूल्य x एक रजिस्टर में संग्रहित है और हाल ही में एक अंकगणितीय संचालन का परिणाम था (जैसे add के रूप में, या sub, लेकिन वहाँ कई और अधिक संभावनाएं हैं) कि EFLAGS रजिस्टर में हस्ताक्षर झंडा एस एफ सेट, तो cmp निर्देश की कोई आवश्यकता नहीं है, और संकलक केवल js निर्देश उत्सर्जित कर सकता है। कोई आसान jCC निर्देश नहीं है जो इनपुट -1 था जब कूदता है।

+21

मुझे विश्वास नहीं है कि यह किसी भी कार्यक्रम में "बाधा" है या नहीं। यदि आपने समय में कोई अंतर देखा है तो यह अधिक संभावना है कि आप == -1 स्थिति पर "कूद गए" कोड को उदा। इसे 2 तक सेट करना और इस प्रकार लूप को समाप्त नहीं किया गया (माना जाता है कि अभिव्यक्ति एक लूप का हिस्सा थी)। – lothar

+5

यह न भूलें कि सीएमपी निर्देश को एक या निर्देश द्वारा प्रतिस्थापित किया जा सकता है, जो चक्रों की संख्या को कम नहीं करेगा लेकिन स्मृति संरेखण को बदल सकता है। यह सहायक हो सकता है, या यह प्रतिकूल हो सकता है, यही कारण है कि प्रोफाइलिंग बहुत महत्वपूर्ण है। –

+16

पीएस इस सवाल पर नज़र डालें - मेरे पास लूप थे जो इतने तंग थे कि इस तरह के अनुकूलन में कोई फर्क पड़ता है। आम तौर पर केवल कुछ प्रतिशत, लेकिन हर छोटी सी कभी-कभी मदद करता है! –

1

वही, दोनों ऑपरेशन आमतौर पर 1 घड़ी में किए जाते हैं।

+0

देखें एक निर्देश fetch-and-execute चक्र, लेकिन एक घड़ी चक्र नहीं। – raimue

7

दोनों ऑपरेशन एक ही CPU चरण में किए जा सकते हैं, इसलिए उन्हें एक ही प्रदर्शन के अनुसार होना चाहिए।

+8

Arrrghh!हालांकि चिप्स के विशाल बहुमत पर यह सच है, लेकिन आप उस प्लेटफॉर्म को जानने के बिना * एक निश्चित बयान नहीं दे सकते * जिस पर वह काम कर रहा है। पूरी दुनिया x86 नहीं है। – dmckee

+2

बस इसमें से अधिकांश;) –

+3

वैसे मैं मानता हूं कि क्या वह इस प्रश्न को एक विशिष्ट, गैर-सामान्य वास्तुकला के लिए पूछ रहे थे, जो वह इस तरह निर्दिष्ट करेगा। अगर वह सामान्य रूप से पूछ रहा है, तो मैं सबसे आधुनिक वास्तुकलाओं के लिए एक सरल जवाब देने की कोशिश कर रहा था। –

23

क्यों? आप जो भी करते हैं, संकलक इसे उस प्लेटफॉर्म पर अनुकूलित करेगा जिसे आप वर्तमान में संकलित कर रहे हैं।

यदि आपको यह जांचना है कि यह -1 है, तो (x == -1) का उपयोग करें, यदि आप जानना चाहते हैं कि यह शून्य से कम है, तो इसके बजाय इसका उपयोग करें। लिखें कि आप जोर से क्या पढ़ेंगे।

इस तरह की छोटी चीजें कुछ भी तेज़ नहीं कर पाएंगी, और आपको छोटे ऑपरेशन तेज होने की बजाय पठनीयता और साफ डिज़ाइन के बारे में चिंतित होना चाहिए।

और यदि यह कोई तार्किक परिवर्तन नहीं करता है, तो आपके प्लेटफ़ॉर्म पर संभावनाएं हैं, दोनों एक सीपीयू चक्र में प्रदर्शन करेंगे।

+0

धन्यवाद। यह वास्तव में उच्च लोड कार्यक्रम में बाधा ऑपरेटर है। इस 1-2 तारों में प्रदर्शन पठनीयता की तुलना में अधिक मूल्यवान है और मैं हमेशा // टिप्पणियां लिख सकता हूं। –

+8

यदि आप इस छोटे से कुछ भी महत्वपूर्ण प्रदर्शन लाभ प्राप्त करते हैं, संभावना है कि आपके डिज़ाइन को रिफैक्टरिंग (अधिक उपयुक्त एल्गोरिदम) की आवश्यकता है। लेकिन जैसे अन्य लोगों ने कहा है, इसे अपनी वर्तमान स्थिति के लिए ढूंढने के लिए प्रोफाइल करें। – GManNickG

+4

सभी बाधाएं आमतौर पर यह छोटी होती हैं, यहां तक ​​कि सही एल्गोरिदम के साथ भी सही डिजाइन में (हालांकि ऐसा कोई नहीं है)। मैं उच्च लोड डीएनए प्रसंस्करण करता हूं और अपने क्षेत्र और मेरे एल्गोरिदम को अच्छी तरह से जानता हूं। –

3

महत्वपूर्ण विचार, वैसे भी, जो वास्तव में आपके प्रोग्राम प्रवाह को सही तरीके से निर्देशित करता है, और जो एक ही परिणाम उत्पन्न करने के लिए होता है?

यदि एक्स वास्तव में और सूचकांक या एक enum में एक मान है, तो -1 हमेशा आप चाहते हैं कि क्या होगा, या कोई नकारात्मक मूल्य काम करेगा? अभी, -1 केवल नकारात्मक है, लेकिन यह बदल सकता है।

11

इसे आजमाएं और देखें! प्रत्येक के एक अरब, या बेहतर, एक अरब करो और उन्हें समय। मैं शर्त लगाता हूं कि आपके परिणामों में कोई सांख्यिकीय महत्व नहीं है, लेकिन कौन जानता है - शायद आपके प्लेटफ़ॉर्म और कंपाइलर पर, आपको परिणाम मिल सकता है।

यह स्वयं को यह समझाने के लिए एक शानदार प्रयोग है कि समयपूर्व अनुकूलन शायद आपके समय के लायक नहीं है - और यह "the root of all evil--at least in programming" हो सकता है।

+1

यह सलाह है, लेकिन वास्तव में एक जवाब नहीं है। –

2

आप इस प्रश्न का संदर्भ के बाहर भी जवाब नहीं दे सकते। आप एक छोटी सी microbenchmark के लिए प्रयास करते हैं तो यह पूरी तरह से संभव है कि अनुकूलक आकाश में अपने कोड गूंज होगा:

// Get time 
int x = -1; 
for (int i = 0; i < ONE_JILLION; i++) { 
    int dummy = (x < 0); // Poof! Dummy is ignored. 
} 
// Compute time difference - in the presence of good optimization 
// expect this time difference to be close to useless. 
+0

यह संकलक द्वारा शून्य निर्देशों में अनुकूलित किया जाएगा। लेकिन मैं आपका विचार समझ गया, धन्यवाद। –

+0

हां - यही वह है जो मैं एक मजेदार तरीके से कहने की कोशिश कर रहा था। अगर यह पहली कोशिश पर स्पष्ट नहीं था, मेरी गलती। –

+0

आप एक्स और डमी से बचने की इजाजत देकर कुछ हद तक इससे बच सकते हैं (यानी, उनके पॉइंटर्स को किसी अन्य अनुवाद इकाई में फ़ंक्शन में पास करें) और एक कंपाइलर-विशिष्ट मेमोरी बाधा निर्देश जैसे जीसीसी के __sync_synchronize() को पेश करना। यह कंपाइलर को कोड (x <0) का मूल्यांकन करने और डमी सेट करने के लिए कोड उत्सर्जित करने के लिए मजबूर करेगा - लेकिन यह मेमोरी एक्सेस को भी मजबूर करेगा। – bdonlan

7

यह इस बात पर निर्भर हो सकता है कि तुलना किस प्रकार की तुलना में होती है या तुलना में सफल होती है। उदाहरण के लिए, यदि आप तुलना करने से पहले x को मान निर्दिष्ट करते हैं, तो किसी विशिष्ट मान की तुलना करने के लिए साइन ध्वज की जांच करना तेज़ हो सकता है। या सीपीयू की शाखा-पूर्वानुमान प्रदर्शन प्रभावित हो सकता है जिससे आप चुनते हैं।

लेकिन, जैसा कि अन्य ने कहा है, यह सीपीयू आर्किटेक्चर, मेमोरी आर्किटेक्चर, कंपाइलर और कई अन्य चीजों पर निर्भर है, इसलिए कोई सामान्य जवाब नहीं है।

+0

धन्यवाद, अच्छा जवाब। –

7

x < 0 तेज़ होगा। यदि कुछ और नहीं है, तो यह निरंतर -1 को एक ऑपरेंड के रूप में लाने से रोकता है। अधिकांश आर्किटेक्चर में शून्य के मुकाबले तुलना करने के लिए विशेष निर्देश हैं, जिससे इससे भी मदद मिलेगी।

+2

आर्किटेक्चर और/या कंपाइलर को जानने के बिना आप इसे कैसे बता सकते हैं? –

+1

आप किस वास्तुकला के बारे में बात कर रहे हैं? मेरा मानना ​​है कि अधिकांश x86 निर्देश सेट तत्काल मूल्य के विरुद्ध तुलना कर सकते हैं। एक ऑपरेंड लाने की जरूरत नहीं है। यहां एक इंटेल निर्देश सेट संदर्भ का एक लिंक दिया गया है: http://www.intel.com/Assets/PDF/manual/253666.pdf – jabbie

+0

निश्चित रूप से, लगभग कोई भी आर्किटेक्चर तत्काल मूल्य के विरुद्ध तुलना कर सकता है। लेकिन यहां तक ​​कि निर्देश भी बड़ा है (और इसलिए स्मृति से एक और लाने की आवश्यकता है)।एक बड़ा सौदा नहीं है, जब तक कि प्रदर्शन का हर औंस महत्वपूर्ण न हो, जो यहां संदर्भ प्रतीत होता है। मुझे लगता है कि प्रश्नकर्ता एक डिवाइस चालक या कुछ लिख रहा है। –

1

यह आर्किटेक्चर पर निर्भर करता है, लेकिन x == -1 अधिक त्रुटि-प्रवण है। x < 0 जाने का रास्ता है।

+1

नहीं, यह जाने का रास्ता नहीं है। त्रुटियों का पता लगाने के लिए, यूनिट परीक्षण का उपयोग करें, फैंसी कोड नहीं। कम त्रुटि प्रवण होने के लिए: स्थिरांक को एक नाम दें। आमतौर पर सीधे बिंदु पर जाना बेहतर होता है। यदि लक्ष्य -1 से तुलना करना है, तो बस (x == -1) लिखें, अन्यथा इस कोड को बनाए रखने वाले अगले डेवलपर को यह पता लगाना होगा कि हम 0 की तुलना क्यों कर रहे हैं ("ओह, ठीक है, यह वास्तव में परीक्षण करने के लिए है -1 "), और फिर पता लगाएं कि क्या (एफ ...) -1 है। – Jem

+0

ठीक है, हम एक आदर्श मामले के बारे में बात कर रहे हैं। जैसा कि आप कहते हैं, किसी को "जादू संख्या", लेकिन स्थिरांक का उपयोग नहीं करना चाहिए। आप इस तरह से (x <= VALUE) की तुलना कर सकते हैं। आमतौर पर आप काउंटर चर के साथ ऐसा करते हैं, इसलिए यह कम त्रुटि प्रवण होने का एक अच्छा तरीका है। वास्तविक दुनिया में, इकाई परीक्षण हमेशा नहीं किया जा सकता (समय या अन्य बाधाएं)। स्पष्ट रूप से यदि यह एक विशेष मामला है तो आप केवल '-1' मान को देखना चाहते हैं, (x == VALUE) यह जाने का तरीका है। –

1

जैसा कि अन्य ने कहा है कि शायद कोई अंतर नहीं है। तुलना एक सीपीयू में ऐसे मौलिक संचालन हैं कि चिप डिजाइनर जितनी जल्दी हो सके उन्हें बनाना चाहते हैं।

लेकिन कुछ और है जो आप विचार कर सकते हैं। प्रत्येक मूल्य की आवृत्तियों का विश्लेषण करें और उस क्रम में तुलना करें। यह आपको कुछ चक्र बचा सकता है। बेशक आपको इसे सत्यापित करने के लिए अभी भी अपने कोड को एएसएम संकलित करने की आवश्यकता है।

1

मुझे यकीन है कि आपको विश्वास है कि यह एक वास्तविक समय लेने वाला है।

मुझे लगता है कि मशीन पूछने से हम किसी भी विश्वसनीय जवाब दे सकते हैं।

मुझे पता चला है कि कोड में भी आप बात कर रहे हैं, मेरा मानना ​​है कि मुझे पता था कि समय कहां जा रहा था, बिल्कुल सही नहीं था। उदाहरण के लिए, यदि यह एक आंतरिक लूप में है, यदि कोई फ़ंक्शन कॉल है, तो कंपाइलर द्वारा डाला गया एक अदृश्य भी, उस कॉल की लागत अब तक हावी होगी।

1

निकोले, आपके द्वारा लिखी:

यह वास्तव में है उच्च लोड कार्यक्रम में ऑपरेटर टोंटी। इस 1-2 तार में प्रदर्शन और अधिक मूल्यवान पठनीयता से है ...

सभी बाधाओं आमतौर पर इस छोटे, यहां तक ​​कि सही एल्गोरिदम के साथ एकदम सही डिजाइन में (हालांकि वहाँ कोई ऐसी है)।मैं उच्च लोड डीएनए प्रसंस्करण करते हैं और मेरे खेत और मेरे एल्गोरिदम काफी अच्छी तरह से तो

हां, तो क्यों अगले नहीं क्या करना है:

  1. , टाइमर मिलता 0 पर सेट करें;
  2. साथ (एक्स < 0) अपने उच्च लोड कार्यक्रम संकलन;
  3. अपना प्रोग्राम और टाइमर शुरू करें;
  4. कार्यक्रम अंत पर टाइमर को देखो और result1 याद है।
  5. 1 के समान;
  6. साथ (एक्स == -1) अपने उच्च लोड कार्यक्रम संकलन;
  7. 3 के समान;
  8. कार्यक्रम अंत पर टाइमर को देखो और result2 याद है।
  9. परिणाम 1 और परिणाम 2 की तुलना करें।

आप जवाब मिल जाएगा।

संबंधित मुद्दे