2011-05-13 12 views
9

त्वरित सवाल जोड़ने के लिए, पहले से संभालने86 इंक बनाम के सापेक्ष प्रदर्शन अनुदेश

mov eax, 0 

जो अधिक कुशल है?

inc eax 
inc eax 

या

add eax, 2 

इसके अलावा, मामले में दो inc रों तेजी से कर रहे हैं, compilers (जैसे कि, जीसीसी) आमतौर पर (अर्थात w/ओ आक्रामक अनुकूलन झंडे) का अनुकूलन करने के लिए यह var += 2 करते हैं?

आपके समय के लिए धन्यवाद!

पीएस: "समय-समय पर अनुकूलन न करें" की भिन्नता के साथ उत्तर देने के लिए परेशान न हों, यह केवल अकादमिक रूचि है।

+4

उत्तर शायद प्रोसेसर-विशिष्ट होगा और ज्यादातर मामलों में शायद कोई मापनीय अंतर नहीं होगा। यदि आप * वास्तव में * एक विशिष्ट सीपीयू के उत्तर को जानने में रुचि रखते हैं तो इसे बेंचमार्क करें। –

+0

संभावित डुप्लिकेट [क्या एडीडी 1 वास्तव में आईएनसी से तेज है? x86] (http://stackoverflow.com/questions/13383407/is-add-1-really-faster-than-inc-x86) –

उत्तर

2

सभी उद्देश्यों के लिए, यह शायद कोई फर्क नहीं पड़ता। लेकिन ध्यान दें कि inc कम बाइट्स का उपयोग करता है।

निम्नलिखित कोड पर विचार करें:

int x = 0; 
x += 2; 

किसी भी अनुकूलन झंडे का उपयोग कर के बिना, जीसीसी इस कोड को संकलित करता है:

80483ed:  c7 44 24 1c 00 00 00 movl $0x0,0x1c(%esp) 
80483f4:  00 
80483f5:  83 44 24 1c 02   addl $0x2,0x1c(%esp) 

-O1 और -O2 का उपयोग करना, यह हो जाता है:

c7 44 24 08 02 00 00 movl $0x2,0x8(%esp) 

मजेदार, है ना?

12

यदि आप कभी भी कच्चे x86 निर्देशों के प्रदर्शन आंकड़े जानना चाहते हैं, तो Dr Agner Fogs listings (वॉल्यूम 4 सटीक होना) देखें। कंपाइलर्स के बारे में भाग के रूप में, यह संकलक के कोड जनरेटर पर निर्भर करता है, और ऐसा कुछ नहीं जो आपको बहुत अधिक भरोसा करना चाहिए।

एक तरफ ध्यान दें पर

: मुझे लगता है कि यह हास्यास्पद/विडंबना है कि प्रदर्शन के बारे में एक प्रश्न में, आप MOV EAX,0 इस्तेमाल किया XOR EAX,EAX के बजाय एक रजिस्टर शून्य: पी (और अगर MOV EAX,0 पहले से किया गया था, सबसे तेजी से संस्करण निकालने के लिए किया जाएगा इंक और ऐड और बस MOV EAX,2)।

+0

एग्नेर कोहरे के लिए +1 ;-) – hirschhornsalz

17

दो inc उसी रजिस्टर पर निर्देश (या अधिक आम तौर पर दो पढ़ने-संशोधित-लिखने के निर्देश बोलते हैं) हमेशा कम से कम दो चक्रों की निर्भरता श्रृंखला रखते हैं। यह एक inc के लिए एक घड़ी की विलंबता मान रहा है, जो 486 के बाद से मामला है। इसका मतलब है कि आस-पास के निर्देशों को उन लेटेंसी को छिपाने के लिए दो inc निर्देशों के साथ interleaved नहीं किया जा सकता है, कोड धीमा निष्पादित करेगा।

लेकिन कोई संकलक अनुदेश अनुक्रम तुम वैसे भी प्रस्ताव उत्सर्जित करेगा (mov eax,0xor eax,eax से बदल दिया जाएगा, What is the purpose of XORing a register with itself? देख)

mov eax,0 
inc eax 
inc eax 

यह इंटेल पुस्तिका से

mov eax,2 
+1

ध्यान दें कि 'xor eax, eax; इंक ईएक्स 'को अधिकांश कंपाइलर्स द्वारा' mov eax, 1' पर पसंद किया गया है, हालांकि। इस तथ्य के कारण हो सकता है कि यह 5 बाइट्स के बजाय 3 बाइट्स है। – Polynomial

+0

@ पॉलीनोमियल यदि 'mov eax, 0' को 2 बाइट्स में एन्कोड किया जा सकता है तो' mov eax, 1' को 2 बाइट्स में भी एन्कोड किया जा सकता है (1 ऑपोड + 1 तत्काल) –

+0

@ LưuVĩnhPhúc 'mov eax, 1' 5 बाइट्स है:' बी 8 01 00 00 00'। यह 8-बाइट शाब्दिक और क्यूडब्ल्यूओआर उपसर्ग के कारण 64-बिट के लिए 10 बाइट्स है: '48 बी 8 01 00 00 00 00 00 00 00'। तुलनात्मक रूप से, 'xor रैक्स, रैक्स; inc eax' केवल 5 बाइट्स है: '48 31 c0 ff c0' – Polynomial

2

को Optimizied किया जाएगा कि आप here पा सकते हैं ऐसा लगता है कि एडीडी/एसयूबी निर्देश एक विशेष आर्किटेक्चर पर आधे चक्र सस्ता हैं। लेकिन याद रखें कि इंटेल इसके (हालिया) प्रोसेसर के लिए आउट ऑफ़ ऑर्डर निष्पादन मॉडल का उपयोग करता है। इसका मुख्य अर्थ यह है कि, जहां भी प्रोसेसर को डेटा आने के लिए इंतजार करना पड़ता है, प्रदर्शन प्रदर्शन बाधाएं दिखाई देती हैं (उदाहरण के लिए, यह एल 1/एल 2/एल 3/रैम डेटा-फ़ेच के दौरान करने वाली चीज़ों से बाहर हो गई)। तो यदि आप प्रोफाइलर हैं तो आपको बताता है कि आईएनसी समस्या हो सकती है; कच्चे चक्र-गणनाओं को देखने के बजाय इसे डेटा-थ्रूपुट बिंदु दृश्य देखें।

Instruction    Latency1   Throughput   Execution Unit 
                  2 
CPUID     0F_3H 0F_2H  0F_3H 0F_2H 0F_2H 

ADD/SUB     1  0.5  0.5  0.5  ALU 
[...] 
DEC/INC     1  1   0.5  0.5  ALU 
+3

आईआईआरसी 0f_2h पी 4 प्रेस्कॉट है, क्या वह शांति में आराम कर सकता है। उन आधे घड़ी की लेटेंसी आंतरिक रूप से डबल घड़ी वाली पाइपलाइन से होती हैं। यह इंटेल के लिए एक बहुत बुरा विचार साबित हुआ। – hirschhornsalz

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