मैं C ++ और C # डेवलपर हूं। मैंने .NET फ्रेमवर्क के पहले बीटा के बाद से C # एप्लिकेशन विकसित किया है और मुझे C ++ एप्लिकेशन विकसित करने में 20 से अधिक वर्षों का अनुभव है। सबसे पहले, C # कोड कभी भी C ++ एप्लिकेशन की तुलना में तेज़ नहीं होगा, लेकिन मैं प्रबंधित कोड, यह कैसे काम करता है, इंटर-ऑप लेयर, मेमोरी मैनेजमेंट इंटर्नल, डायनेमिक टाइप सिस्टम और कचरा संग्रहकर्ता के बारे में एक लंबी चर्चा से नहीं गुजरेगा। फिर भी, मुझे यह कहते हुए जारी रखना चाहिए कि यहाँ सूचीबद्ध बेंचमार्क सभी परिणाम उत्पन्न करते हैं।
मुझे समझाने दो: पहली चीज जिस पर हमें विचार करने की आवश्यकता है वह है CIT (.NET फ्रेमवर्क 4) के लिए JIT कंपाइलर। अब जेआईटी विभिन्न अनुकूलन एल्गोरिदम का उपयोग करके सीपीयू के लिए मूल कोड का उत्पादन करता है (जो कि डिफ़ॉल्ट सी ++ ऑप्टिमाइज़र की तुलना में अधिक आक्रामक होता है) और विजुअल स्टूडियो द्वारा उपयोग किए जाने वाले निर्देश सेट वास्तविक सीपीयू का एक निकट प्रतिबिंब हैं। मशीन में घड़ी कोड को कम करने और सीपीयू पाइपलाइन कैश में हिट दर में सुधार करने और आगे हाइपर-थ्रेडिंग अनुकूलन जैसे कि हमें निर्देश पुन: व्यवस्थित करने और शाखा भविष्यवाणी से संबंधित सुधारों को उत्पन्न करने के लिए मशीन कोड में कुछ निश्चित प्रतिस्थापन किए जा सकते हैं।
इसका मतलब यह है कि जब तक आप अपने C ++ एप्लिकेशन को RAILASE बिल्ड (DEBUG बिल्ड नहीं) के लिए सही पैरामीटर्स का उपयोग करके संकलित करते हैं, तब तक आपका C ++ एप्लिकेशन संबंधित C # या .NET आधारित एप्लिकेशन की तुलना में अधिक धीरे-धीरे प्रदर्शन कर सकता है। अपने C ++ एप्लिकेशन पर प्रोजेक्ट गुणों को निर्दिष्ट करते समय, सुनिश्चित करें कि आप "पूर्ण अनुकूलन" और "फास्ट कोड के पक्ष" को सक्षम करते हैं। यदि आपके पास 64 बिट मशीन है, तो आप x64 को लक्ष्य प्लेटफ़ॉर्म के रूप में बनाना चाहते हैं, अन्यथा आपका कोड रूपांतरण सब-लेयर (WOW64) के माध्यम से निष्पादित किया जाएगा, जो प्रदर्शन को काफी कम कर देगा।
एक बार जब आप संकलक में सही अनुकूलन करते हैं, तो मुझे C ++ एप्लिकेशन के लिए .72 सेकंड और C # एप्लिकेशन के लिए 1.16 सेकंड (दोनों बिल्ड बिल्ड में) मिलते हैं। चूँकि C # एप्लिकेशन बहुत बुनियादी है और स्टैक पर लूप में उपयोग की जाने वाली मेमोरी को आवंटित करता है और ढेर पर नहीं, यह वास्तव में ऑब्जेक्ट्स, भारी कंप्यूटर्स और बड़े डेटा-सेट्स में शामिल एक वास्तविक एप्लिकेशन की तुलना में बहुत बेहतर प्रदर्शन कर रहा है। इसलिए उपलब्ध कराए गए आंकड़े C # और .NET फ्रेमवर्क के प्रति आशावादी आंकड़े हैं। इस पूर्वाग्रह के साथ भी, C ++ एप्लिकेशन समकक्ष C # एप्लिकेशन की तुलना में आधे से अधिक समय में पूरा होता है। ध्यान रखें कि मैंने जो Microsoft C ++ कंपाइलर का उपयोग किया था, उसमें सही पाइपलाइन और हाइपरथ्रेडिंग ऑप्टिमाइज़ेशन (असेंबली निर्देशों को देखने के लिए WinDBG का उपयोग करना) नहीं था।
अब अगर हम Intel कम्पाइलर का उपयोग करते हैं (जो कि AMD / Intel प्रोसेसर पर उच्च प्रदर्शन अनुप्रयोगों को उत्पन्न करने के लिए एक उद्योग रहस्य है), तो वही कोड Microsoft Visual Studio 2010 का उपयोग करके C ++ निष्पादन योग्य बनाम .72 सेकंड के लिए .54 सेकंड में निष्पादित होता है। तो अंत में, अंतिम परिणाम हैं .54 सेकंड C ++ के लिए और 1.16 सेकंड C # के लिए। तो .NET JIT कंपाइलर द्वारा कोड का उत्पादन C ++ निष्पादन योग्य की तुलना में 214% अधिक समय लेता है। .54 सेकंड में बिताया गया अधिकांश समय सिस्टम से समय प्राप्त करने में था और लूप के भीतर ही नहीं!
आँकड़ों में भी गायब है स्टार्टअप और सफाई समय जो समय में शामिल नहीं हैं। C # एप्लिकेशन C ++ अनुप्रयोगों की तुलना में स्टार्ट-अप और समाप्ति पर बहुत अधिक समय व्यतीत करते हैं। इसके पीछे का कारण जटिल है और .NET रनटाइम कोड सत्यापन दिनचर्या और स्मृति प्रबंधन सबसिस्टम के साथ करना है जो मेमोरी आवंटन और कचरे को अनुकूलित करने के लिए कार्यक्रम की शुरुआत (और परिणामस्वरूप, अंत में) बहुत काम करता है। एकत्र करनेवाला।
C ++ और .NET IL के प्रदर्शन को मापते समय, यह सुनिश्चित करने के लिए विधानसभा कोड को देखना महत्वपूर्ण है कि सभी गणनाएं हैं। मैंने जो पाया वह यह है कि C # में कुछ अतिरिक्त कोड डाले बिना, ऊपर के उदाहरणों में अधिकांश कोड वास्तव में बाइनरी से हटा दिए गए थे। C ++ के साथ भी यही हुआ था जब आपने अधिक आक्रामक अनुकूलक का उपयोग किया था जैसे कि इंटेल C ++ कंपाइलर। मेरे द्वारा ऊपर दिए गए परिणाम 100% सही हैं और विधानसभा स्तर पर मान्य हैं।
इंटरनेट पर बहुत सारे मंचों के साथ मुख्य समस्या यह है कि बहुत से नौसिखिया बिना प्रौद्योगिकी को समझे Microsoft विपणन प्रचार को सुनते हैं और झूठे दावे करते हैं कि C # C ++ से तेज है। दावा है कि सिद्धांत रूप में, C # C ++ से तेज है क्योंकि JIT कंपाइलर CPU के लिए कोड को ऑप्टिमाइज़ कर सकता है। इस सिद्धांत के साथ समस्या यह है कि .NET फ्रेमवर्क में बहुत सी पाइपलाइन मौजूद है जो प्रदर्शन को धीमा कर देती है; प्लंबिंग जो C ++ एप्लिकेशन में मौजूद नहीं है। इसके अलावा, एक अनुभवी डेवलपर को दिए गए प्लेटफॉर्म के लिए उपयोग करने के लिए सही कंपाइलर पता होगा और एप्लिकेशन को संकलित करते समय उपयुक्त झंडे का उपयोग करना होगा। लिनक्स या ओपन सोर्स प्लेटफॉर्म पर, यह एक समस्या नहीं है क्योंकि आप अपने स्रोत को वितरित कर सकते हैं और इंस्टॉलेशन स्क्रिप्ट बना सकते हैं जो उपयुक्त अनुकूलन का उपयोग करके कोड को संकलित करते हैं। खिड़कियों या बंद स्रोत प्लेटफॉर्म पर, आपको विशिष्ट निष्पादन के साथ प्रत्येक को कई निष्पादन योग्य वितरित करना होगा। जिन विंडो बायनेरिज़ को तैनात किया जाएगा वे एमएसआई इंस्टॉलर (कस्टम क्रियाओं का उपयोग करके) द्वारा पता लगाए गए सीपीयू पर आधारित हैं।