2012-09-18 7 views
6

पूर्ण प्रकटीकरण - मैं द्वारा Is x += a quicker than x = x + a?+ = तेज़ से = = है?

अलग रूप में, मैं += बनाम -= परीक्षण करने का फैसला यही कारण है कि प्रेरित था। सरल परीक्षण बताते हैं कि वे वही हैं।

std::vector<int> x; 
for (int i = 0 ; i < 10000 ; i++) 
    x.push_back(rand()%10); 

और फोन += और -= आनुपातिक दी गई संख्या के लिए: तो मैं करने के लिए कुछ इसी तरह की कोशिश की

long long sum = 0; 

for (each number in the array) 
    if (x[j] < k) 
     sum += x[j]; 
    else 
     sum -= x[j]; 

इसलिए, अगर k, है कहते हैं, छोटे, -= अधिक बार बुलाया जायेगा (duuuh)। मैंने k = 2 के साथ प्रयास किया जो -= का उच्च अनुपात प्रदान करेगा, और k = 5 के साथ, जो -= और += की समान संख्या के बारे में उपज करना चाहिए।

पंचलाइन: -= कॉलिंग += पर कॉल करने से लगभग दोगुनी तेज है। इस मामले में यह और अधिक कुशल क्यों होगा?

+4

मुझे लगता है कि "प्रेरित" होने के लिए बेहतर चीजें हैं। – Mysticial

+0

शायद ए + बी के लिए थोड़ा सा फायदा, यह मानते हुए कि ए-बी सिर्फ ए + (-बी) – nullpotent

+7

दो शब्द हैं: शाखा भविष्यवाणी। संकेत: K = 8 –

उत्तर

15

I'm gonna jump in before Mysticial gets a hold of this and guess: branch prediction.

इसलिए, यह -= बनाम += नहीं है।

हालत x[j] < k बेहतर भविष्यवाणी की जा सकती है जब यह है लगभग हमेशा true या false जब वहाँ संख्या है जिसके लिए वह या तो करने के लिए मूल्यांकन कर सकते हैं की एक ही नंबर के बारे में है की तुलना में यह हो सकता है।

k = 2 के लिए, 10 में से एक false का मूल्यांकन करेगा।

k = 5 के लिए, वे वही होंगे और बेतरतीब ढंग से वितरित किए जाएंगे, भविष्यवाणी करना कठिन होगा।

संपादित करें: http://ideone.com/1PYMl देखें - अप्रयुक्त कोड अनुकूलन (cout एस) को रोकने के लिए सभी अतिरिक्त सामान हैं।

tl; डॉ: k बदलती के लिए परिणाम:

k: 1 Time: 280 
k: 2 Time: 360 
k: 3 Time: 440 
k: 4 Time: 520 
k: 5 Time: 550 
k: 6 Time: 510 
k: 7 Time: 450 
k: 8 Time: 360 
k: 9 Time: 260 

के रूप में आप देख सकते हैं, करीब k एक अस्त व्यस्त बदलती हालत के लिए, हो जाता है कार्यक्रम अधिक लेता है। सिरों के लिए, इसमें लगभग आधा समय लगता है।

+4

तो आप भविष्यवाणी करते हैं कि यह शाखा भविष्यवाणी –

+0

के बारे में है, मैं एक ही चीज़ कहने वाला था। साथ ही, मुख्य प्रश्न का उत्तर देने के लिए, लगभग सभी आर्किटेक्चर पर, ऐड और उप निर्देश _should_ मूल रूप से एक ही समय लेते हैं। – slugonamission

+0

@ मिस्टिकिक हे - मैंने लिंक किया: पी –

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