2015-05-22 6 views
6

यह पूछने के लिए एक मूर्ख सवाल हो सकता है, लेकिन इस तरह का अनुकूलन कभी-कभी आपके एप्लिकेशन के प्रदर्शन को बढ़ावा देता है। यहां मैं विशेष रूप से सी ++ के लिए पूछ रहा हूं, क्योंकि सी ++ संकलन कोड सी # या जावा बहुत अलग है।सी ++ में, जो बेहतर है I> -1 या i> = 0

प्रश्न यह है कि कौन सा वैरिएबल मैं int करता हूं, तो बेहतर होता है।

  1. i > -1
  2. i >= 0

मैं स्मृति ब्लॉक या आवश्यक रजिस्टर और सीपीयू दोनों स्थितियों के लिए आवश्यक चक्र के मामले में प्रदर्शन के लिए देख रहा हूँ।

अग्रिम धन्यवाद।

+5

सभी प्रदर्शन-वार पर कोई अंतर नहीं। लेकिन आप जानते हैं, आप जेनरेटेड असेंबली को अपने आप देख सकते हैं और पूछने से पहले इसे बेंचमार्क कर सकते हैं। –

+0

जेनरेट असेंबली कोड लगभग समान है। मुझे नहीं लगता कि यहां कोई अंतर है। – anishsane

+4

जांचें [यह] (http://stackoverflow.com/questions/12135518/is-faster-than) बाहर। – shauryachats

उत्तर

14

विधानसभा भाषा में, दोनों एक ही संरचना पर हैं करने के लिए यह परिवर्तन:

  1. i > -1

    cmp [register with i value],-1 
    jg [somewhere] 
    
  2. i >= 0

    cmp [register with i value],0 
    jge [somewhere] 
    

used jump flags के अनुसार, अनुदेश jg दो झंडे comparaisons (जेडएफ = 0 और एस एफ = के) बनाने, लेकिन केवल एक (एस एफ = के) jge करता है।

तो मैं यह कहने का लुत्फ उठाता हूं कि दोनों लगभग उसी रजिस्ट्रार और सीपीयू चक्र का उपयोग करते हैं, शायद i >= 0 के लिए बहुत ही कम त्वरित तुलना के साथ।

+0

एक के बजाए यहां तक ​​कि 2 झंडे की तुलना चक्र की एक ही संख्या लेती है, नहीं? – RSinohara

+0

@RSinohara मुझे ऐसा नहीं लगता है। प्रोग्रामिंग कोड में एक ही नमूना लें: 'if (कुछ) 'और' if (something && something_else)' के बीच धीमा क्या है? – Aracthor

+0

तत्काल मान -1 लोड करना अधिक महंगा हो सकता है या अधिक बाइट की आवश्यकता हो सकती है। अस्पष्ट, चाहे जेआईटी ने दूसरे रूप में एक फॉर्म अनुकूलित किया हो। – usr

2

ठीक है, तर्क के अनुसार> ऑपरेशन> = से "सस्ता" हो सकता है, लेकिन मुझे लगता है कि आप ऑप्टिमाइज़ेशन विकल्प सक्षम के साथ संकलित कर रहे हैं, इसलिए शायद संकलक जो भी वह आपके कोड को अनुकूलित करना चाहता है, तो मैं कहूंगा कि ऐसा नहीं करता 'टी बात है, भले ही एक वास्तव में तेजी से होता है, शायद संकलक सबसे अच्छा विकल्प

0

एक लूप लिखते समय इसे for (i = 0; i < 1000; i++) से for (i = 1000; i > 0; i--) में परिवर्तित करने के लिए फायदेमंद हो सकता है क्योंकि कुछ आर्किटेक्चर पर संकलक तुलना निर्देश को छोड़ सकता है क्योंकि ध्वज के रूप में ध्वज सेट किया जाएगा जब मैं पहुंचता हूं 0. आधुनिक आर्किटेक्चर पर मुझे यकीन नहीं है यह मायने रखता है।

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