2015-01-19 8 views
11

कहें कि मेरे प्रोग्राम में वास्तव में प्रदर्शन-महत्वपूर्ण लूप था जहां मुझे यह जांचने की आवश्यकता है कि कोई बिंदु आयताकार के अंदर था या नहीं, लेकिन मुझे लगता है कि निचले सीमाएं हमेशा 0 होने जा रही हैं, (x >= 0 && y >= 0 && x < width && y < height)हस्ताक्षर किए गए पूर्णांक पर हस्ताक्षरित पनिंग टाइप कर सकते हैं> = तुलना की आवश्यकता को समाप्त कर सीमाओं की जांच तेजी से कर सकते हैं?

मैं द्वारा पहले दो तुलना को खत्म कर सके प्रकार punning, अहस्ताक्षरित पूर्णांकों के लिए x और y (या सी ++ में एक unionreinterpret_cast<>() की तरह कुछ के साथ उदाहरण के लिए) के बाद से संकेत बिट किसी भी नकारात्मक संख्या एक unsigned int बड़ा पर्याप्त में बदल जाएगा गारंटी होगी सीमाओं की जांच में विफल होने के लिए? यदि हां, तो आप इसे C++ या किसी अन्य भाषा में कार्यान्वित करने के बारे में कैसे जाएंगे? क्या आप ऐसा करके कोई प्रदर्शन सुधार प्राप्त कर सकते हैं?

+0

संभावित रूप से एक डुप्लिकेट: http://stackoverflow.com/questions/2711522/what-happens-if-i-assign-a-negative-value-to-an-unsigned-variable –

+1

परिवर्तित करने के लिए 'static_cast' का उपयोग करें पूर्णांक प्रकार। आप यह देखने के लिए असेंबली की तुलना करने का प्रयास कर सकते हैं कि संकलक स्वचालित रूप से इसे अनुकूलित करता है या नहीं। –

+0

@ जेरेमीफ्रिसनर मैं नहीं कहूंगा - * यह * प्रश्न * उस * उत्तर के बारे में बहुत जागरूक प्रतीत होता है। –

उत्तर

12

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

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

+0

यदि मैं आपके परीक्षण परिणामों को समझता हूं, तो आप कह रहे हैं कि मैन्युअल रूप से ऐसा करना कोई फर्क नहीं पड़ता ... यह परवाह किए बिना होता है? –

+1

ठीक है, अगर उचित नामांकित इनलाइन फ़ंक्शन में रखा गया है, तो उसे कोड को खराब करने की आवश्यकता नहीं है। –

+3

यह सही है, संकलक इस अनुकूलन अवसर को देखने के लिए पर्याप्त स्मार्ट है और यह आपके लिए करता है। –

3

शायद ...

जबकि "कागज" पर इस आप चार के बजाय केवल दो तुलना (जो अच्छा है) प्रदर्शन करने के लिए अनुमति देने के लिए प्रतीत होता है - आप गारंटी नहीं दे सकते हैं कि यह कैसे प्रदर्शन करेंगे। इन दिनों अधिकांश सीपीयू एक साथ कई समांतर संचालन कर सकते हैं - और आपके द्वारा की गई चार तुलनाओं को आसानी से समानांतर में गणना की जाती है।

आपका प्रश्न कंपाइलर, सीपीयू और चेक के पहले और बाद में कोड पर निर्भर करता है - इसलिए मेरा जवाब "शायद" है।

बचें कास्टिंग एक्स, एक प्रकार के लिए y वे वर्तमान में क्या कर रहे हैं तुलना में एक अलग आकार की है कि - int8_t को uint8_t ठीक है से अर्थात डाली, int8_t uint32_t को जुर्माना लग सकते हैं।

नए सिरे से लिखना आप इच्छा के रूप में:

if ((static_cast<uint8_t>(x) < width) && 
    (static_cast<uint8_t>(y) < length)) 

परीक्षण प्रदर्शन डेल्टा काफी मुश्किल है, आप कुछ RDTSC अनुदेश उपयोग करने से पहले और बाद में समय को पकड़ने के लिए विधानसभा के साथ अपने कोड रैप करने के लिए की आवश्यकता होगी। आपको पाइपलाइन को फ्लश करने के लिए सीपीयूआईडी निर्देश का भी उपयोग करने की आवश्यकता होगी।

संक्षेप में, मेरे अनुकूलन उचित लगता है, लेकिन शायद कुछ भी नहीं मिलेगा। हालांकि यह काम करेगा।

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