2011-06-14 15 views
5

मैंने अपने सी ++ प्रोग्राम (जो एक गेम पेड़ की खोज करता है) का परीक्षण करने के लिए एक बेंचमार्क विधि लिखी है, और मुझे लगता है कि एक्सकोड 4.0.2 में "एलएलवीएम कंपाइलर 2.0" विकल्प के साथ संकलन करने से मुझे लगता है कि मैं संकलित करता हूं MacPorts से clang ++ के नवीनतम संस्करण के साथ।मैकपॉर्ट्स से एक्सकोड के एलवीएम बनाम क्लैंग ++ के साथ मुझे तेज बाइनरी क्यों मिलती है?

यदि मैं सही ढंग से समझता हूं तो मैं दोनों मामलों में एक क्लैंग फ्रंट एंड एंड एलवीएम बैक एंड का उपयोग कर रहा हूं। क्या ऐप्पल ने मैक ओएस के लिए तेज बाइनरी बनाने के लिए अपने क्लैंग/एलएलवीएम वितरण में सुधार किए हैं? मुझे परियोजना के बारे में ज्यादा जानकारी नहीं मिल रही है।

यहाँ बेंचमार्क मेरा कार्यक्रम विभिन्न compilers के लिए पैदा करता है, सभी का उपयोग कर -O3 अनुकूलन कर रहे हैं (उच्च बेहतर है):

(Xcode) "gcc 4.2": 38.7 
(Xcode) "llvm gcc 4.2": 51.2 
(Xcode) "llvm compiler 2.0": 50.6 
g++-mp-4.6: 43.4 
clang++: 40.6 
इसके अलावा

, मैं कैसे बजना/LLVM XCode के साथ संकलन करते टर्मिनल से उपयोग कर रहा है ? मुझे आदेश नहीं मिल रहा है।

संपादित करें: स्कोर जो मैं आउटपुट करता हूं "प्रति सेकंड हजारों गेम" हैं जिन्हें कार्यक्रम के लंबे समय तक चलाने की गणना की जाती है। स्कोर कई रनों पर बहुत संगत होते हैं, और हाल के प्रमुख एल्गोरिदमिक सुधारों ने मुझे 1% - 5% स्पीड अप दिया है, उदाहरण के लिए। मेरे कार्यक्रम के लिए 40 से 50 की 25% गति बहुत बड़ी है।

अद्यतन: मैं -flto के साथ कमांड लाइन से clang ++ का आह्वान नहीं कर रहा था। अब जब मैं कमांड लाइन से क्लैंग ++ -O3 -flto/डेवलपर/usr/bin/clang ++ -O3 -flto की तुलना करता हूं तो परिणाम निकट होते हैं, लेकिन ऐप्पल अभी भी 6.5% तेज है।

अब जीसीसी के लिए लिंक समय अनुकूलन को कैसे सक्षम करें?

cc1plus: error: LTO support has not been enabled in this configuration 
+2

यदि वे मिलीसेकंड हैं और आपने परीक्षण नहीं किया है, औसत गणना करने के लिए 100 मिलियन बार, तो आपका बेंचमार्क गलत है। –

+1

@ तामास: मुझे गंभीरता से संदेह है कि यह मिलीसेकंड है, यह देखते हुए कि 'llvm कंपाइलर 2।0' 'clang ++ 'से अधिक पढ़ रहा है और ओपी का दावा है कि पूर्व दोनों में से तेज़ है। – ildjarn

+0

आप शायद सही हैं, मैं सिर्फ मूल्यों के माध्यम से स्किम किया और सोचा कि अंतर बहुत छोटा है। –

उत्तर

2

एप्पल LLVM संकलक/डेवलपर/usr/bin/बजना के तहत उपलब्ध होना चाहिए: मैं जी ++ -flto जब कोशिश मैं निम्नलिखित त्रुटि मिलती है।

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

0

एक एल्गोरिथ्म की सटीक गति चीजें हैं जो पूरी तरह से अपने और संकलक की शक्ति से बाहर हैं के सभी प्रकार पर निर्भर कर सकते हैं। आपके पास एक लूप हो सकता है जहां निष्पादन का समय स्मृति पर निर्देशों को गठबंधन करने के तरीके पर निर्भर करता है, जिस तरह से संकलक भविष्यवाणी नहीं कर सकता था। मैंने ऐसे मामलों को देखा है जहां एक लूप प्रति पुनरावृत्ति के विभिन्न निष्पादन समय के साथ अलग-अलग "राज्यों" में प्रवेश कर सकता है (इसलिए एक संदर्भ स्विच के बाद, यह एक राज्य में प्रवेश कर सकता है जहां यह 12 या 13 चक्रों को यादृच्छिक रूप से लिया जाता है)। यह सब संयोग हो सकता है।

और आप विभिन्न पुस्तकालयों का उपयोग कर रहे हैं, जो कारण काफी संभव है। मैकोज़ एक्स में, वे उदाहरण के लिए std :: स्ट्रिंग और std :: वेक्टर का एक नया और संभवतः तेज़ कार्यान्वयन का उपयोग कर रहे हैं।

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