2017-11-22 37 views
7

स्कूल असाइनमेंट के कारण मुझे एक सी ++ कोड को असेंबली (एआरएमवी 8) में परिवर्तित करना होगा। फिर मुझे GCC के -O0, -O1, -O2, -O3 और -Os ऑप्टिमाइज़ेशन का उपयोग करके C++ कोड संकलित करना होगा, समय लिखें और मेरे असेंबली कोड के निष्पादन समय के साथ तुलना करें। जैसा कि, मुझे लगता है कि मुझे पता है -O3 -O1 और -O2 से तेज़ होना चाहिए। हालांकि, मुझे लगता है कि -ओ 2 सबसे तेज़ है, फिर -ओ 1, -ओ 3, -ओएस, -ओ 0 हैं। क्या यह सामान्य है? (परिकलित समय लगभग 30 सेकंड हैं)।अनुकूलित निष्पादन समय

+2

[जीसीसी: -ओ 3 और -ओएस के बीच अंतर] (https://stackoverflow.com/questions/19689014/gcc-difference-between-o3-and-os) – Bilkokuya

+0

मुझे संभावित प्रश्न जोड़ना चाहिए मैंने फ़्लैग किया है विशेष रूप से -ओ 2 के बारे में नहीं पूछता है, इसका उत्तर स्वीकार्य उत्तर द्वारा दिया जाता है। – Bilkokuya

+2

आपका प्रश्न शीर्षक संकलन समय को संदर्भित करता है, लेकिन आपका प्रश्न टेक्स्ट निष्पादन समय के बारे में अधिक चिंतित लगता है, जो एक ही बात नहीं है। – lurker

उत्तर

1

हां, यह सामान्य है। गाइड ऑप्टिमाइज़ेशन के रूप में -ऑक्स ऑप्टिमाइज़ेशन लें। औसतन, वे अनुकूलन का उत्पादन करते हैं जो विज्ञापन है, लेकिन उस शैली पर बहुत निर्भर करता है जिसमें कोड लिखा गया है, स्मृति लेआउट, साथ ही संकलक स्वयं भी। कभी-कभी, आपको इष्टतम कोड प्राप्त करने से पहले कई बार कोशिश करने और विफल करने की आवश्यकता होती है। -O2 वास्तव में अधिकांश मामलों में सर्वश्रेष्ठ अनुकूलन देता है।

+0

धन्यवाद! मैं केवल -O0 पास करने में कामयाब रहा, जहां मेरा असेंबली कोड लगभग 33 के दशक में 57 और -ओ 1-3 में चलता है। यह अच्छा है? – Monstermania

+0

हां, यह अच्छा है, और आगे अनुकूलन के लिए, आपको शायद बहुत समय और प्रयास करने की ज़रूरत है। सी ++ कोड सी कोड की तुलना में अनुकूलित करने के लिए आम तौर पर अधिक कठिन होता है। यदि आप कर सकते हैं, तो आप ढेर और ढेर के आकार को बदलकर स्मृति अनुकूलन के साथ खेलने का प्रयास कर सकते हैं। कभी-कभी, यह मदद करता है। – VladP

2

ध्यान दें कि जीसीसी में कई अन्यoptimization flags हैं।

कोई गारंटी नहीं है कि -O3-O2 से तेज़ कोड देता है; एक कंपाइलर अधिक अनुकूलन पास लागू कर सकता है, लेकिन वे सभी ह्युरिस्टिक्स हैं और असफल हो सकते हैं (या आपके विशेष कोड को धीमा कर सकते हैं)। इसलिए ऐसा होता है कि -O3-O2 से कुछ थोड़ा धीमा कोड देता है (कुछ विशेष इनपुट स्रोत कोड पर)।

आप जीसीसी का नवीनतम संस्करण आजमा सकते हैं (नवीनतम नवंबर 2017- GCC 7 है, जीसीसी 8 कुछ महीनों में बाहर जाएगा)। आप कुछ better-march= या -mtune= विकल्प भी आजमा सकते हैं।

अंत में, अपने GCC plugin साथ, आप अपने खुद अनुकूलन पास जोड़ सकते हैं या लागू अनुकूलन के आदेश (और सेट) बदल सकता है गुजरता है (वहाँ कई सैकड़ों विभिन्न अनुकूलन जीसीसी में गुजरता हैं)। लेकिन आपको जीसीसी का विस्तार करने में सक्षम होने के लिए बहुत सारे काम (शायद एक वर्ष या दो) की आवश्यकता होगी।

आप अनुकूलन मानकों को ट्यून कर सकते हैं, और कुछ प्रोजेक्ट (MILEPOST) ने उन्हें सुधारने के लिए मशीन सीखने की तकनीक का भी उपयोग किया है।

मेरे (पुराने) GCC MELT documentation पर स्लाइड और संदर्भ भी देखें।

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