C C ++ की तुलना में C विशेष रूप से तेज़ है [बंद]


83

जहां तक ​​मैं समझता हूं कि सभी स्क्रिप्टिंग भाषाएं और मुख्य वैज्ञानिक कार्यक्रम आमतौर पर सी में लिखे जाते हैं; यह क्रियान्वयन को सीधे तौर पर एक प्रकार से गड़बड़ कर देता है।

मैं समझता हूं कि ये लोग अपने प्रदर्शन को अधिकतम करना चाहते हैं लेकिन सी + + कक्षाओं का उपयोग करने के लिए सी स्ट्रिंग्स और सी संरचनाओं का उपयोग करने के बीच एक वास्तविक अंतर है; सी ++ एक ही तरह से काम करता है, वर्चुअल फ़ंक्शंस के अलावा, यह एक बार एक क्लास फंक्शन को स्टोर करता है और उस क्लास का हर इंस्टेंस उस एक फंक्शन को कॉल करता है।

सी क्या तेज करता है और क्या यह अजगर या साइक्लाइट जैसे प्रोजेक्ट में उल्लेखनीय अंतर है, जिन्हें सबसे तेज होना है?


9
"आपको वास्तविक समस्याओं के आधार पर केवल व्यावहारिक, जवाबदेह प्रश्न पूछने चाहिए।" - stackoverflow अक्सर पूछे जाने वाले प्रश्न।
RedGrittyBrick 10

2
"किसी भी भाषा में लिखित कोड हमेशा किसी अन्य भाषा में खराब लिखे गए कोड से बेहतर होता है।"
केरेक एसबी

5
@Will - नहीं। "एक भाषा दूसरी भाषा की तुलना में तेज़ है" अचूक है। भाषाएँ केवल अपने कार्यान्वयन के लिए तेज़ नहीं हैं। "क्या किसी भाषा का X क्रियान्वयन दूसरे के Y क्रियान्वयन से तेज है?" प्रोफाइलिंग द्वारा जवाबदेह है, लेकिन आप क्या प्रोफाइल करते हैं? भाषा की विविधता विभिन्न क्षेत्रों में तेज या धीमी हो सकती है और उन सभी का परीक्षण निस्संदेह असंभव है। एक बेहतर सवाल यह होगा कि "भाषा डिजाइनर वाई भाषा के बजाय एक्स भाषा का चयन क्यों करते हैं?" इसका स्पष्ट उत्तर है (विभिन्न भाषा डिजाइनरों द्वारा दिए गए तर्क) और सहायक होने की अधिक संभावना है।
क्रिस लुत्ज़

3
C और C ++ में समान कोड आमतौर पर समान गति से चलना चाहिए , अपवाद कोड जिसमें अलग-अलग अलियासिंग नियमों के कारण अलग-अलग शब्दार्थ होते हैं, आदि अंतर C मुहावरों और C ++ मुहावरों के बीच है। यदि आप C या C ++ में सर्वोत्तम प्रथाओं C मुहावरों के साथ कोड लिखते हैं, तो यह आमतौर पर सर्वोत्तम प्रथाओं C ++ मुहावरों के साथ लिखे गए समान कार्यक्षमता की तुलना में बहुत हल्का और तेज (और संभाल करने में कम विफलता वाले मामले होंगे) (चाहे आप इसे लिखते हों) C या C ++ में), लेकिन यह शायद आपको लिखने के लिए बहुत अधिक काम लेगा।
आर .. गिटहब स्टॉप हेल्पिंग ICE

9
C, C ++ की तुलना में अपनी संपूर्णता में सीखने के लिए विशेष रूप से तेज़ है;
fredoverflow

जवाबों:


68

C ++ का उपयोग अक्सर वैज्ञानिक कार्यक्रमों के लिए किया जाता है। C की लोकप्रियता उस डोमेन में कम हो सकती है। फोरट्रान एक "निम्न-स्तरीय" भाषा के रूप में लोकप्रिय है।

C ++ में, "आप केवल उसी चीज़ का भुगतान करते हैं जो आप उपयोग करते हैं।" इसलिए ऐसा कुछ भी नहीं है जो इसे सी के मुकाबले धीमा बना दे। विशेष रूप से वैज्ञानिक कार्यक्रमों के लिए, अभिव्यक्ति टेम्पलेट्स से कार्यक्रम के शब्दार्थों को संसाधित करने के लिए टेम्पलेट इंजन का उपयोग करके कुछ कस्टम अनुकूलन करना संभव हो जाता है।

सी को पाइथन जैसी परियोजनाओं के लिए पसंद किया जाता है क्योंकि यह पढ़ने में कम भ्रमित होता है, इसलिए एक बड़ा कोडबेस योगदानकर्ताओं के एक बड़े पूल के लिए अधिक सुलभ होगा।

SQLite में छोटे निष्पादन योग्य कोड आकार की आवश्यकता होती है, जहां C में थोड़ी बढ़त होती है। C ++ का विवेकपूर्ण उपयोग अभी भी एम्बेडेड अनुप्रयोगों में उपयोग करने की अनुमति देता है, लेकिन यह डर के कारण कम लोकप्रिय है कि अवांछित भाषा सुविधाएँ रेंगेंगी।


10
ध्यान दें कि C ++ मैन्बलिंग का नाम नहीं देता है, जहाँ C नहीं करता है, इससे अन्य भाषाओं के लिए सीधे C के साथ इंटरफ़ेस करना आसान हो जाता है। (swig वास्तव में C ++ लाइब्रेरी के लिए अजगर आवरण बनाने से पहले आपके लिए C ++ कोड को C इंटरफ़ेस बनाता है।)
सैम पी

8
@SamP C ++ में नाम मैनबलिंग को निष्क्रिय करने की सुविधा है extern "C"। स्वाइग सी को एक लिंगुआ फ्रेंका के रूप में उपयोग करने के लिए होता है, लेकिन आप उस आवरण को C ++ के C- संगत सबसेट के भीतर लागू कर सकते हैं और कभी भी C कंपाइलर नहीं लगा सकते।
पोटाटोज़वाटर

"SQLite में छोटे निष्पादन योग्य कोड आकार की आवश्यकता होती है, जहां C में थोड़ी बढ़त होती है।" मुझे नहीं लगता है कि मुहावरेदार सी ++ में लिखा गया SQLite, C कार्यान्वयन की तुलना में कोई भी बड़ा बाइनरी-वार या धीमा होगा। यह निश्चित रूप से बहुत कम सी ++ कोड होगा, और यह वैकल्पिक LINQ और संकलन-समय क्वेरी पूर्व-अनुकूलन और संकलन की पेशकश कर सकता है। C को उसके लिए एक कोड जनरेटर की आवश्यकता होगी, और इस तरह SQLITE के साथ आप प्रश्नों को पूर्व-संकलित नहीं कर सकते। C ++ SQLITE आपको बिना किसी हस्तक्षेप किए VM कोड के लिए रेंज-फॉर के साथ रिकॉर्ड को पुनरावृत्त करने देगा, और यह तुलना में C SQLITE को घोंघा-प्रतीत होगा। बहुत बुरा ...
कुबा मोनिका

वास्तव में, एक विशिष्ट आकार के प्रति जागरूक एम्बेडेड SQLITE एप्लिकेशन में एक निश्चित क्वेरी सेट होता है, और डेटाबेस को फ्लैश से मेमोरी-मैप किया जाता है, फिक्स्ड स्कीमा के साथ, और SQL दुभाषिया और वीएम मृत वजन होते हैं, जैसा कि अन्य कोड का एक बहुत है। मैंने SQLITE में निम्न-स्तरीय पृष्ठ एक्सेस का उपयोग करके "रॉ" C का उपयोग करते हुए प्रश्न लिखने के साथ कुछ प्रयोग किए हैं, और अपने विशेष एप्लिकेशन के लिए मैं 85% SQLITE कोड, अधिक-या-कम को छोड़ सकता हूं। इसलिए, अगर कुछ भी, SQLITE C ++ का लाभ नहीं उठाकर बड़ा समय खो देता है, लेकिन यह उन प्लेटफार्मों की ओर लक्षित है जहां कोई C ++ उपलब्ध नहीं है, और उन्होंने प्रश्नों के लिए C कोड जनरेटर लागू नहीं किया।
क्यूबा

@UnslanderMonica 1. C ++ बायनेरिज़ में अपवाद हैंडलिंग टेबल हैं, जो खाली होने पर भी एक मार्जिन जोड़ते हैं। 2. SQLite बाईटेकोड आधारित है। C ++ में कंपाइल-टाइम क्वेरी ऑप्टिमाइज़ेशन का अर्थ होगा कॉन्स्टेक्सप्र फ़ंक्शन में पार्सिंग और विश्लेषण, जो पॉइंटर्स का उपयोग नहीं कर सकता है। इससे पता चलता है कि उत्पाद में किसी भी तरह का SQLite नहीं होगा। 3. क्या कोई ऐसा तरीका नहीं है जिससे बायटेकोड को बचाया जा सके और टेक्स्ट और पार्सर को एप्लिकेशन और लाइब्रेरी बायनेरिज़ से अलग किया जा सके? 4. Parser-free या "headless" SQLite C ++ हैडर-ओनली बायटेकोड जनरेटर / ऑप्टिमाइज़र के साथ इंटरफेस कर सकता है।
पोटाटोसवेटर

27

मुझे नहीं लगता कि इसका कारण प्रदर्शन से बहुत अधिक संबंध है, क्योंकि यह इंटरऑपरेबिलिटी है। C ++ भाषा C भाषा की तुलना में अधिक जटिल है, लेकिन प्रदर्शन के दृष्टिकोण से किसी भी तरह से उल्लेखनीय अंतर नहीं होना चाहिए। कुछ C ++ कंस्ट्रक्शन C समतुल्य की तुलना में तेज़ होते हैं ( std::sortकी तुलना में तेज़ होते हैं qsort) और आसपास के दूसरे तरीके के शायद अच्छे उदाहरण हैं।

संपादित करें: अंतर पक्ष पर ...

मूल रूप से, C ++ मानक उन कुछ चीजों को परिभाषित नहीं करता है, जिन्हें अलग-अलग संकलक या संस्करणों के साथ बनाए गए बायनेरिज़ के बीच आसान अंतर के लिए आवश्यक हो सकता है। यहां सबसे उल्लेखनीय मुद्दा बाइनरी में प्रतीकों के लिए नामकरण सम्मेलन होगा। सी में, भाषा कोड के प्रत्येक प्रतीक से द्विआधारी प्रतीक नाम के लिए एकल मानचित्रण को परिभाषित करती है। नामक एक फ़ंक्शन my_functionबाइनरी नामक एक प्रतीक का निर्माण करेगा my_function। दूसरी ओर, और फ़ंक्शन ओवरलोडिंग जैसी सुविधाओं के कारण, C ++ फ़ंक्शन का नाम मंगवाना पड़ता है(बाइनरी में विभिन्न फ़ंक्शन प्रतीकों में अनुवादित, तर्कों के प्रकार एन्कोडिंग और रिटर्न प्रकार), और मानक यह परिभाषित नहीं करता है कि मैनलिंग कैसे किया जाता है। बदले में इसका मतलब है कि C ++ में एक ही फ़ंक्शन को संकलक के आधार पर विभिन्न प्रतीकों के लिए संकलित किया जा सकता है (जब तक extern "C"कि C ++ में उन कार्यों के लिए C इंटरऑपरेबिलिटी को बाध्य करने के लिए उपयोग नहीं किया जाता है)।

दिन के अंत में, स्क्रिप्टिंग भाषा और मूल कोड के बीच इंटरफ़ेस को वैसे भी C इंटरफ़ेस होना चाहिए, भले ही यह आंतरिक रूप से कैसे लागू किया गया हो, का विवरण C / C ++ / कोई अन्य मूल भाषा हो सकती है।

(मैं जानबूझकर भाषा की प्राथमिकताओं के एक लौ युद्ध में प्रवेश नहीं करना चाहता हूं, सी ++ वास्तव में शक्तिशाली है, लेकिन यह थोड़ा डरावना भी है क्योंकि यह सी की तुलना में बहुत अधिक जटिल भाषा है, और कुछ चीजें जो सरल दिखती हैं, उन पर प्रभाव पड़ सकता है। प्रदर्शन)


2
मुझे लगता है कि कोई व्यक्ति आत्मविश्वास से कह सकता है कि आधुनिक, मुहावरेदार सी ++ के लिए इनलाइनिंग, आरवीओ, निरंतर तह आदि का पूरा फायदा उठाने के लिए एक बुद्धिमान कंपाइलर की आवश्यकता होती है। इसके साथ ही, यह पूरी तरह से संभव है कि भारी-भरकम सी ++ कंस्ट्रक्शन बिल्कुल भी ध्यान देने योग्य न हों। मशीन स्तर, लेकिन सी के लिए सी ++ के लिए एक अच्छा संकलक कहीं अधिक महत्वपूर्ण है
केरेक एसबी

@ केरेक एसबी: अधिकांश आधुनिक सी ++ कंपाइलर (जहां आधुनिक अर्थ पिछले कुछ वर्षों में) मुहावरेदार सी ++ निर्माण और अनुकूलन की पहचान करने में वास्तव में अच्छे हैं। ऐसा std::sortही एक उदाहरण है: std::lessडिफ़ॉल्ट रूप से उपयोग किया जाने वाला फ़न्क्टर समतुल्य सी फ़ंक्शन की तुलना में कम कुशल नहीं है, लेकिन मुझे पता है कि सभी कंपाइलर इसे इनलाइन करेंगे (टेम्पलेट इनलाइनिंग के लिए उपलब्ध है) और फ़ंक्टर को फ़ंक्शन के सभी कॉल हटा दें compare
डेविड रोड्रिगेज -

मजेदार रूप से, इलेक्ट्रॉनिक आर्ट्स की EASTL लाइब्रेरी आंशिक रूप से इस दावे से उचित है कि उन्होंने जीसीसी को इनलाइनिंग में खराब पाया (और MSVC को बेहतर होना चाहिए) और इस प्रकार मानक पुस्तकालय बहुत अधिक अनपेक्षित फ़ंक्शन कॉल को रोक देगा। EASTL में वे इससे निपटने के लिए कम अप्रत्यक्ष उपयोग करते हैं। कौन जानता है कि वह तर्क आजकल कितना सही है।
केरेक एसबी

13

जैसा कि Bjarne ने [D & E] में उल्लेख किया है कि प्रभावशीलता C ++ के मुख्य लक्ष्यों में से एक है। इसलिए C ++ केवल तभी धीमी होती है जब प्रोग्रामर अपने "अतिरिक्त" फ़ंक्शंस का उपयोग करता है जैसे आपके द्वारा बताए गए वर्चुअल फ़ंक्शंस, आरटीई जानकारी आदि

इसलिए मुझे लगता है कि यह मनोवैज्ञानिक कारणों से अधिक है - सी का उपयोग किया जाता है क्योंकि यह "धीमी" सी ++ सुविधाओं की अनुमति नहीं देता है।


9

भाषाएँ स्वाभाविक रूप से तेज़ या धीमी नहीं हैं, दुभाषियों और संकलक अधिक या कम कुशल हो सकते हैं।

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


25
स्क्रिप्टेड भाषाएँ
स्वाभाविक रूप से

2
@ Will03uk - आम तौर पर स्क्रिप्टेड भाषा के लिए कंपाइलर लिखने से आपको क्या फर्क पड़ता है?
क्रिस लूत्ज

6
@ क्रिस तब यह एक स्क्रिप्टेड भाषा नहीं होगी; एक स्क्रिप्टेड भाषा के निहितार्थ यह है कि इसकी व्याख्या या बाइटकोड को संकलित किया गया है। एक बार जब आप इसे संकलित करते हैं, तो यह एक संकलित भाषा नहीं है
Will03uk

1
यह संपूर्ण सत्य नहीं है: भाषा शब्दार्थ मायने रखता है क्योंकि वे ऑप्टिमाइज़र के लिए उपलब्ध जानकारी का निर्धारण करते हैं और जो अनुमान पूरे कार्यक्रम विश्लेषण करने के बिना सुरक्षित रूप से किए जा सकते हैं; बिंदु में मामला: restrictC या luajit में कीवर्ड - बाद वाला गतिशील भाषाओं के लिए हर दूसरे vm को पूरी तरह से पानी से नहीं उड़ाता है क्योंकि माइक एक स्मार्ट लड़का है, लेकिन यह भी क्योंकि लूआ के शब्दार्थ बहुत सुंदर होते हैं (उदाहरण के लिए जावास्क्रिप्ट की तुलना में)
क्रिस्टोफ

1
@Christoph मैं जो कहना चाह रहा हूं वह यह है कि चांदी की गोली नहीं है। यदि आपको डायनामिक डिस्पैच, वर्चुअल कॉल, कोड की हॉट लोडिंग, या डक टाइपिंग जैसी चीजें चाहिए, तो एक ऐसी भाषा जो "धीमी" लग सकती है, जो उसे बॉक्स से बाहर प्रदान करती है, शायद सी। में एक भोले-भाले कार्यान्वयन से ज्यादा तेज है
फोरट्रान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.