C इतना तेज़ क्यों है, और दूसरी भाषाएँ उतनी तेज़ या तेज़ क्यों नहीं हैं? [बन्द है]


208

StackOverflow पॉडकास्ट को सुनने में, जेब आता रहता है कि "वास्तविक प्रोग्रामर" सी में लिखते हैं, और सी इतना तेज है क्योंकि यह "मशीन के करीब है।" किसी अन्य पोस्ट के लिए पूर्व के दावे को छोड़कर, सी के बारे में क्या खास है जो इसे अन्य भाषाओं की तुलना में तेज होने की अनुमति देता है? या दूसरा तरीका: क्या बाइनरी को संकलित करने में सक्षम होने से अन्य भाषाओं को रोकना है जो हर बिट को सी के रूप में तेजी से चलाता है?


6
क्या आप सूचीबद्ध कर सकते हैं कि किस विशेष शो ने इस बारे में बात की? मैं इसे सुनना पसंद करूंगा।
गियोवन्नी गाल्बो '’

2
वास्तव में आश्चर्य हुआ कि इस प्रश्न का कितना बुरा उत्तर दिया गया है (अधिकांश उत्तर संकलित और व्याख्या की गई भाषाओं आदि के बीच बुनियादी अंतरों को नजरअंदाज करते हैं, मुझे जेआईटी यादा यादा के बारे में पता है), और कितने लोग अपनी पसंदीदा भाषा (फोरमैन लड़के की जरूरत है) का 'बचाव' कर रहे हैं एक गोली लेने के लिए)।
टिम रिंग

विधानसभा भाषा मत भूलना। असेंबली-असेंबल्ड एग्जिट की तुलना में कुछ भी तेज या अधिक कॉम्पैक्ट नहीं है। असेंबली लगभग शुद्ध बाइनरी है इसलिए यह बिना पूर्वाग्रह के सबसे तेज भाषा है।
KKZiomek

3
C सबसे तेज़ है क्योंकि यह प्रकाश की गति, और सापेक्षता है?
ताराविया

यह निश्चित रूप से गलत है कि C सबसे तेज प्रोग्राम भाषा है। किसी भी प्रकार की कोई भी कार्यक्रम भाषा FORTH की गति के निकट नहीं आती है। FORTH का उपयोग परमाणु बमों को चलाने के लिए किया जाता है, यह सबसे अधिक उपग्रहों पर कार्यक्रम भाषा, अंतर्राष्ट्रीय अंतरिक्ष स्टेशन में मुख्य कार्यक्रम की भाषा और सर्न में और ITER पर भी है। मैं Microsoft C (विभिन्न संस्करणों) और FORTH के बीच की गति की तुलना कर रहा था। YAWN to C ...
कार्तिकेय कूल

जवाबों:


200

सी के बारे में बहुत कुछ खास नहीं है। यही कारण है कि यह तेज है।

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

पकड़ है, अतिरिक्त प्रसंस्करण ओवरहेड है जो आवेदन के प्रदर्शन को नीचा दिखाएगा। C के पास ऐसा कोई भी नहीं है, जिसका अर्थ है कि कोई ओवरहेड नहीं है, लेकिन इसका मतलब है कि प्रोग्रामर को मेमोरी को आवंटित करने और मेमोरी लीक को रोकने के लिए उन्हें मुक्त करने में सक्षम होना चाहिए, और चर के स्थिर टाइपिंग से निपटना होगा।

उस ने कहा, कई भाषाओं और प्लेटफार्मों, जैसे कि जावा (इसके जावा वर्चुअल मशीन के साथ ) और .NET (इसकी सामान्य भाषा रनटाइम के साथ) ने वर्षों से प्रदर्शन में सुधार किया है, जैसे कि सिर्फ-इन-टाइम संकलन जैसे देशी मशीन कोड से उत्पादन उच्च प्रदर्शन को प्राप्त करने के लिए बाइटकोड।


3
कचरा संग्रह मैन्युअल मेमोरी मैनेजमेंट (अल्पकालिक कार्यक्रमों और / या बहुत सारी मेमोरी के लिए) से तेज हो सकता है। जीसी सरल और तेज आवंटन की अनुमति देता है, और कार्यक्रम चीजों को डील करने में समय व्यतीत नहीं करता है।
कोर्नेल

2
C प्रोग्राम आम तौर पर एक आवश्यक आधार पर मेमोरी आवंटित और निपटाते हैं। यह अक्षम्य है। एक अच्छा वीएम कई मामलों में प्रदर्शन में बड़े लाभ अर्जित करता है, बड़ी मात्रा में आवंटित करेगा और निपटाएगा।
स्कफमैन

60
एक सी प्रोग्राम को समान रूप से "हार्ड" होने से अलग एक ही chunked आवंटन और कचरा संग्रह करने से रोकने से कुछ नहीं होता है।
21

बहुत अच्छी तरह से कहा, लेकिन पसंद करते हैं रोब एलन ने कहा, सी भी कम अमूर्तता प्रदान करता है तो जावा या .NET, जिसके परिणामस्वरूप कम अनुवाद (जो कि इन दिनों सिर्फ-इन-टाइम (जेआईटी) संकलन के कारण कम सच है)
गैब रॉयर

5
पोर्नले, मैनुअल प्रबंधन और समझदार आवंटन हमेशा किसी भी जीसी सिस्टम को बेहतर बनाएंगे जब सही तरीके से उपयोग किया जाता है और बहुत ध्यान दिया जाता है, तो आपको अपने उपयोग पैटर्न के बारे में पूर्ण ज्ञान है, जीसी सिस्टम नहीं करता है, साथ ही जीसी सिस्टम ओवरहेड जोड़ते हैं
आयन टोडराइजर

89

सी डिजाइनरों द्वारा बनाई गई एक व्यापार बंद है। यह कहना है, उन्होंने सुरक्षा के ऊपर गति डालने का निर्णय लिया। C नहीं होगा

  • एरे इंडेक्स सीमा की जाँच करें
  • Uninitialized चर मानों के लिए जाँच करें
  • स्मृति लीक के लिए जाँच करें
  • नल पॉइंटर डेरेफेरेंस की जाँच करें

जब आप एक सरणी में इंडेक्स करते हैं, तो जावा में यह वर्चुअल मशीन, बाउंड चेकिंग और अन्य पवित्रता जांच में कुछ विधि कॉल करता है। यह मान्य और बिल्कुल ठीक है , क्योंकि यह सुरक्षा को जोड़ता है जहां यह होने वाला है। लेकिन सी में, सुंदर तुच्छ चीजों को भी सुरक्षा में नहीं रखा जाता है। उदाहरण के लिए, C को यह जाँचने की आवश्यकता नहीं है कि क्षेत्र ओवरलैप की प्रतिलिपि बनाते हैं या नहीं। यह एक बड़े व्यावसायिक अनुप्रयोग के कार्यक्रम के लिए एक भाषा के रूप में डिज़ाइन नहीं किया गया है।

लेकिन ये डिजाइन निर्णय हैं C भाषा में बग नहीं हैं । वे डिज़ाइन के अनुसार हैं, क्योंकि यह कंपाइलर्स और लाइब्रेरी लेखकों को कंप्यूटर के हर बिट प्रदर्शन को प्राप्त करने की अनुमति देता है। यहाँ C की भावना है कि C Rationale दस्तावेज़ इसे कैसे बताता है:

सी कोड गैर-पोर्टेबल हो सकता है। यद्यपि यह प्रोग्रामर को सही मायने में पोर्टेबल प्रोग्राम लिखने का अवसर देने के लिए प्रयासरत है, कमेटी प्रोग्रामर्स को पोर्ट्रेट रूप से लिखने के लिए मजबूर नहीं करना चाहती थी, सी के उपयोग को एक 'उच्च-स्तरीय असेंबलर' के रूप में करने के लिए: मशीन-विशिष्ट लिखने की क्षमता कोड सी की ताकत में से एक है।

C. की भावना रखें। C. की पारंपरिक भावना को बनाए रखने के लिए एक प्रमुख लक्ष्य के रूप में रखी गई समिति C की भावना के कई पहलू हैं, लेकिन सार अंतर्निहित सिद्धांतों का एक सामुदायिक भाव है, जिस पर C भाषा आधारित है। C की भावना के कुछ पहलुओं को संक्षेप में जैसे वाक्यांशों में दिया जा सकता है

  • प्रोग्रामर पर भरोसा करें।
  • प्रोग्रामर को ऐसा करने से न रोकें जो करने की आवश्यकता है।
  • भाषा को छोटा और सरल रखें।
  • ऑपरेशन करने के लिए केवल एक ही तरीका प्रदान करें।
  • इसे तेज करें, भले ही यह पोर्टेबल होने की गारंटी न हो।

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


51
C, हिंसक रूप से दुर्घटनाग्रस्त होकर null पॉइंटर deref की जाँच करता है। यह कभी-कभी आपके स्टैक फ़्रेम्स और डेटा को स्क्रू करके आउट-ऑफ-रेंज सरणी इंडेक्स और अनइंस्टॉल किए गए वेरिएबल्स के लिए भी जाँच करता है। दुर्भाग्य से यह रनटाइम पर इनकी जाँच करता है।
paxdiablo

18
मैं यह नहीं कहूंगा कि सी सुरक्षित नहीं है, जो आपको लगता है कि आप पर इशारा कर रहे हैं। यह मानता है कि आप मूर्ख नहीं हैं। यदि आप एक बंदूक को इंगित करते हैं और अपने आप को पैर में गोली मारते हैं, तो सी खुशी से उपकृत करेगा और आपको ऐसा करने देगा क्योंकि यह मानता है कि आप इसके साथ अधिक चालाक हैं। जरूरी नहीं कि वह बुरी चीज हो।
बॉब सोमरस

19
@ याकूब: बिल्कुल। सी कहना सुरक्षित नहीं है क्योंकि यह आपको खतरनाक सामान करने देता है जैसे कि कार सुरक्षित नहीं है क्योंकि यह आपको एक चट्टान से ड्राइव करने देगा। C ड्राइविंग करने वाले व्यक्ति के समान सुरक्षित है (लेकिन वहाँ बहुत सारे असुरक्षित ड्राइवर हैं)।
रॉबर्ट गैंबल

5
बॉब, बफर की तरह कीड़े बनाने का मतलब यह नहीं है कि आप एक बेवकूफ हैं। इसका सीधा सा मतलब है कि आप अभी भी इंसान हैं। मुझे पता है कि सी और सी ++ खराब नहीं है (मैं उन्हें बहुत पसंद करता हूं)।
जोहान्स शहाब -

4
@ जोहान्सचैब-लिट सी बड़े पैमाने पर एप्लिकेशन प्रोग्रामिंग के लिए एकदम सही है। अगर किसी को हेलो दुनिया से बड़ी परियोजनाओं को बनाने में मुश्किल होती है, तो समस्या प्रोग्रामर के साथ है, भाषा के साथ नहीं ...

75

यदि आप C में कुछ बनाने के लिए एक महीना बिताते हैं जो 0.05 सेकंड में चलता है, और मैं जावा में एक ही चीज़ लिखने में एक दिन बिताता हूँ, और यह 0.10 सेकंड में चलता है, तो क्या C वास्तव में तेज़ है?

लेकिन आपके प्रश्न का उत्तर देने के लिए, अच्छी तरह से लिखा गया है सी कोड आमतौर पर अन्य भाषाओं में लिखे गए कोड की तुलना में तेजी से चलेगा क्योंकि सी कोड को "अच्छी तरह से" लिखने का एक हिस्सा मशीन के स्तर पर मैन्युअल अनुकूलन करना शामिल है।

हालांकि संकलक वास्तव में बहुत चालाक होते हैं, वे अभी तक रचनात्मक रूप से कोड के साथ आने में सक्षम नहीं हैं जो हाथ से मालिश किए गए एल्गोरिदम के साथ प्रतिस्पर्धा करते हैं ("हाथ" एक अच्छे सी प्रोग्रामर के हैं)।

संपादित करें:

बहुत सारी टिप्पणियाँ "मैं सी में लिखता हूं और मैं अनुकूलन के बारे में नहीं सोचता हूं" की तर्ज पर हैं।

लेकिन इस पोस्ट से एक विशिष्ट उदाहरण लेने के लिए :

डेल्फी में मैं यह लिख सकता था:

function RemoveAllAFromB(a, b: string): string;
var
  before, after :string;
begin
  Result := b;
  if 0 < Pos(a,b) then begin
    before := Copy(b,1,Pos(a,b)-Length(a));
    after := Copy(b,Pos(a,b)+Length(a),Length(b));
    Result := before + after;
    Result := RemoveAllAFromB(a,Result);  //recursive
  end;
end;

और CI में इसे लिखें:

char *s1, *s2, *result; /* original strings and the result string */
int len1, len2; /* lengths of the strings */
for (i = 0; i < len1; i++) {
   for (j = 0; j < len2; j++) {
     if (s1[i] == s2[j]) {
       break;
     }
   }
   if (j == len2) {  /* s1[i] is not found in s2 */
     *result = s1[i]; 
     result++; /* assuming your result array is long enough */
   }
}

लेकिन सी वर्जन में कितनी आशाएं हैं? हम कार्यान्वयन के बारे में बहुत सारे निर्णय लेते हैं जो मैं डेल्फी संस्करण के बारे में नहीं सोचता। एक स्ट्रिंग कैसे लागू किया जाता है? डेल्फी में मैं इसे नहीं देखता। C में, मैंने तय किया है कि यह ASCII पूर्णांकों की एक सरणी के लिए एक संकेतक होगा, जिसे हम चार्ट कहते हैं। सी में, हम एक समय में चरित्र के अस्तित्व के लिए परीक्षण करते हैं। डेल्फी में, मैं पॉस का उपयोग करता हूं।

और यह सिर्फ एक छोटा सा उदाहरण है। एक बड़े कार्यक्रम में, एक सी प्रोग्रामर को कोड के हर कुछ लाइनों के साथ इस प्रकार के निम्न-स्तरीय निर्णय लेने होते हैं। यह एक हाथ से तैयार की जाती है, हाथ से अनुकूलित निष्पादन योग्य है।


45
हालांकि, निष्पक्ष होने के लिए, C में एक महीना ऐसा नहीं होता जो जावा में केवल एक दिन लेता है जिसे निष्पादित करने में केवल 0.05 सेकंड लगते हैं (यानी छोटा कार्यक्रम)।
ड्रीमलैक्स

12
मैंने वर्षों से C में प्रोग्राम किया है और लगभग कभी भी आपके द्वारा संकेत किए गए किसी भी प्रकार के अनुकूलन को करने के लिए नहीं है। मैंने कई कार्यक्रमों को सी (मुख्य रूप से पर्ल से) में पोर्ट किया है और आम तौर पर 10x प्लस की गति में वृद्धि और किसी भी हाथ से कोडित अनुकूलन के बिना स्मृति उपयोग में महत्वपूर्ण कमी देखी है।
रॉबर्ट गैम्बल

1
बेशक कुछ चीजें हैं जो मौजूदा सुविधाओं की कमी के कारण C में प्रोग्राम करने में अधिक समय ले सकती हैं, इसलिए यह कंप्यूटर के प्रदर्शन और प्रोग्रामर के प्रदर्शन (अन्य चीजों के बीच) के बीच एक व्यापार है, यही कारण है कि हम C में सब कुछ प्रोग्राम नहीं करते हैं।
रॉबर्ट गैम्बल

4
मैंने C ++ प्रोग्राम बनाया है जो कम समय में डेटा की हजारों लाइनों को प्रोसेस करता है फिर जावा या .NET प्रोग्राम शुरू हो सकते हैं। यह उन निराशाओं में से एक है जो मेरे पास अधिक आधुनिक भाषाओं के साथ हैं। C लीन प्रोग्राम के लिए बहुत अच्छा है जिसे न्यूनतम रनटाइम आवश्यकताओं की आवश्यकता होती है। PowerBasic उस के लिए भी बढ़िया है।
ब्रुसेक

35
आप एक ऐसा प्रोग्राम कह रहे हैं जो C में एक महीने का समय लेता है और जावा में लिखे गए प्रोग्राम से दोगुना तेज़ है जो केवल लिखने में दिन लेता है वह सार्थक नहीं है? क्या होगा यदि उस कार्यक्रम को दिन में 500,000,000+ बार चलाने की आवश्यकता है? दो बार उपवास के रूप में अविश्वसनीय रूप से महत्वपूर्ण है। यदि यह हजारों या लाखों सीपीयू पर चलता है, तो प्रदर्शन को दोगुना करने के लिए विकास के अतिरिक्त महीने की लागत बचत भारी होगी। मूल रूप से, आपको विकास मंच चुनने से पहले अपनी तैनाती के पैमाने को जानना / समझना होगा।
निकर्सबोट

49

मैंने इसे पहले से ही नहीं देखा था, इसलिए मैं इसे कहूँगा: C तेज़ हो जाता है क्योंकि लगभग सब कुछ C में लिखा गया है

Java C पर बना है, Python C पर बना है (या Java, या .NET, इत्यादि), Perl है, आदि। OS को C में लिखा गया है, C में वर्चुअल मशीनें लिखी गई हैं, संकलन C में लिखे गए हैं। सी में व्याख्याताओं को लिखा जाता है। कुछ चीजें अभी भी असेंबली भाषा में लिखी जाती हैं, जो कि और भी तेज होती हैं। ज्यादा से ज्यादा चीजें किसी और चीज में लिखी जा रही हैं, जो खुद सी में लिखी गई है।

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

व्यक्तिगत रूप से, मैंने शाब्दिक रूप से दर्जनों भाषाओं में लिखा है जो अधिकांश उपलब्ध स्पेक्ट्रमों में फैले हुए हैं, और मैंने व्यक्तिगत रूप से उस जादू की तलाश की है जिसे आप संकेत देते हैं:

मैं अपना केक कैसे बना सकता हूं और कैसे खा सकता हूं? मैं अपनी पसंदीदा भाषा में उच्च-स्तरीय अमूर्तताओं के साथ कैसे खेल सकता हूं, फिर गति के लिए C की नाइटी ग्रिट्टी पर छोड़ दें?

कुछ वर्षों के शोध के बाद, मेरा जवाब पायथन (सी पर) है। आप इसे एक रूप देना चाह सकते हैं। वैसे, आप पायथन से असेंबली के लिए भी ड्रॉप कर सकते हैं, वह भी (एक विशेष पुस्तकालय से कुछ मामूली मदद के साथ)।

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

का आनंद लें।


10
यह वास्तव में जेआईटी-संकलित भाषाओं पर लागू नहीं होता है। यह ऐसा नहीं है कि मेरा C # IL में संकलित किया जा रहा है जिसका अनुवाद C में किया जाता है जिसे मशीन कोड में संकलित किया जाता है। नहीं, IL JIT-संकलित है - और JIT की कार्यान्वयन भाषा उस बिंदु पर अप्रासंगिक है। यह सिर्फ मशीन कोड का उत्पादन कर रहा है।
जॉन स्कीट

3
भगवान ने मना किया कि मुझे पौराणिक जॉन स्कीट पर सवाल उठाना चाहिए, लेकिन यह पूरी तरह से प्रासंगिक लगता है कि जो मशीन कोड का उत्पादन किया जा रहा है वह C के बजाय C # के लिए है, इसलिए यह "उच्च स्तर" है, इसमें अधिक कार्यक्षमता है, सुरक्षा जांच है, आदि और इच्छाशक्ति इसलिए, "बराबर" सी की तुलना में धीमी
रोब विलियम्स

3
@Jon: मैं कुछ इसी तरह की बात कहने वाला था लेकिन यह बिंदु वास्तव में कुछ हद तक वैध है क्योंकि बहुत सारे .NET लाइब्रेरी कोर घटक वास्तव में C में लिखे गए हैं और इस प्रकार C की गति सीमाएं हैं। यह देखना दिलचस्प होगा कि भविष्य में यह कैसे बदलेगा।
कोनराड रूडोल्फ

1
ऐसा लगता है कि चारों ओर गलत तरीका है, अन्य भाषा संकलक / दुभाषिया / वीएमएस अक्सर होते हैं, लेकिन हमेशा सी में नहीं लिखे जाते हैं (या कम से कम सबसे निचली परत के लिए) क्योंकि सी बहुत तेज है (और कई मामलों में सबसे तेज)।
बजे रोमन ए। टेचर

2
यह उत्तर सत्य नहीं है। जैसा कि ऊपर बताया गया है, यह JIT भाषाओं के लिए लागू नहीं होता है, लेकिन यह अपने स्वयं के संकलक वाली भाषाओं के लिए भी लागू नहीं होता है (जो कि, यदि असाधारण प्रयास उन में डाला गया, तो आधुनिक C संकलक की तुलना में तेज़ कोड उत्पन्न कर सकते हैं)। छोड़ी गई भाषाओं की केवल अन्य श्रेणी की व्याख्या की गई भाषाएं हैं, और वे केवल C की तुलना में धीमी नहीं हैं क्योंकि वे स्वयं C में लिखी गई हैं, लेकिन क्योंकि व्याख्या का ओवरहेड, चाहे आप इसे कैसे भी स्लाइस करें और भले ही इंटरप्रेटर विधानसभा में लिखा गया हो , बहुत विशाल।
स्कोर_उंडर

38

वहाँ बहुत सारे सवाल हैं - ज्यादातर मैं जवाब देने के लिए योग्य नहीं हूं। लेकिन इसके लिए पिछले एक:

बाइनरी को संकलित करने में सक्षम होने से अन्य भाषाओं को रोकने के लिए क्या है जो हर बिट सी के रूप में तेजी से चलता है?

एक शब्द में, अमूर्तता।

C मशीन भाषा से अमूर्तता का केवल एक या 2 स्तर है। Java और .Net भाषाएँ असेंबलर से दूर अमूर्त के न्यूनतम 3 स्तरों पर होती हैं। मैं पायथन और रूबी के बारे में निश्चित नहीं हूं।

आमतौर पर, अधिक प्रोग्रामर खिलौने (जटिल डेटा प्रकार, आदि), आगे आप मशीन भाषा से हैं और अधिक अनुवाद करना होगा।

मैं यहाँ और वहाँ से बाहर हूँ, लेकिन यह मूल है।

अद्यतन ------- अधिक विवरण के साथ इस पोस्ट पर कुछ अच्छी टिप्पणियां हैं।


3
तकनीकी रूप से, जावा और .Net उस मशीन की मशीन भाषा से असीम रूप से अलग हो जाते हैं, जिस पर वे चलते हैं। वे VMs में चलते हैं। जेआईटी के साथ भी मूल मशीन कोड के समान कुछ पाने के लिए मूल कोड को बड़े पैमाने पर मालिश करना पड़ता है।
jmucchiello

1
VM में .net कोड नहीं चलता है। यह (32-बिट x 86, 64-बिट x86, या IA64) पर जो भी प्रोसेसर प्लेटफ़ॉर्म चल रहा है, उस पर मूल निर्देश के रूप में चलता है।
रॉबर्ट सी। बार्थ

11
@Robert: .net एक VM का उपयोग करता है । .net कोड को बायटेकोड में संकलित किया जाता है जिसे वीएम द्वारा निष्पादित किया जाता है। VM रन टाइम में मूल निर्देशों में बाईटेकोड को परिवर्तित करता है।
रॉबर्ट गैंबल

3
यह नोट करना बहुत महत्वपूर्ण है कि जावा और अन्य ओओ भाषा के अमूर्त ने प्रोसेसर निर्देश सेट को प्रभावित किया है। नए प्रोसेसर में ऐसे निर्देश हैं जो जावा को तेज़ चलाते हैं यदि जावा वीएम इन अनुकूलन के बारे में जानता है और उनका उपयोग करता है। यह बहुत बड़ा नहीं है, लेकिन यह मददगार है।
एडम डेविस 20

1
हो सकता है कि ThumbEE en.wikipedia.org/wiki/…
रोमन ए। टेचर

35

यह इतना नहीं है कि सी तेज है क्योंकि सी की लागत मॉडल पारदर्शी है । यदि C प्रोग्राम धीमा है, तो यह स्पष्ट तरीके से धीमा है: बहुत सारे कथनों को निष्पादित करके। सी में संचालन की लागत की तुलना में, वस्तुओं पर उच्च-स्तरीय संचालन (विशेष रूप से प्रतिबिंब) या तार में ऐसी लागतें हो सकती हैं जो स्पष्ट नहीं हैं।

दो भाषाएं जो आम तौर पर बायनेरिज़ के लिए संकलित होती हैं जो सी के रूप में तेज़ हैं मानक एमएल ( एमएलटन कंपाइलर का उपयोग करके ) और ऑब्जेक्टिव कैमल । यदि आप बेंचमार्क गेम की जाँच करते हैं, तो आप पाएंगे कि कुछ बेंचमार्क के लिए, बाइनरी पेड़ों की तरह, OCaml संस्करण C. की तुलना में तेज़ है (मुझे कोई MLton प्रविष्टियाँ नहीं मिली।) लेकिन शूटआउट को भी गंभीरता से न लें; यह एक खेल है, जैसा कि कहा जाता है, परिणाम अक्सर प्रतिबिंबित करते हैं कि लोगों ने कोड को ट्यून करने में कितना प्रयास किया है।


किसी भी भाषा में गैर-स्पष्ट रूप से महंगा कोड लिखना संभव है। यह सिर्फ इतना है कि कुछ भाषाओं में, आपको लिस्प या फोर्थ का एक आंतरिक संस्करण लिखना होगा ...
डोनल फैलो

इसके अलावा बेंचमार्क में Rust C से मेल खाता है।
निरा

18

C हमेशा तेज नहीं होता है।

C, आधुनिक फोरट्रान की तुलना में धीमा है।

C कुछ चीजों के लिए अक्सर जावा की तुलना में धीमा होता है। (विशेषकर JIT कंपाइलर के आपके कोड पर जाने के बाद)

सी पॉइंटर एलियासिंग होने देता है, जिसका अर्थ है कि कुछ अच्छे अनुकूलन संभव नहीं हैं। विशेष रूप से जब आपके पास कई निष्पादन इकाइयाँ होती हैं, तो यह डेटा लाने के स्टाल का कारण बनता है। ओउ।

सूचक अंकगणित काम करता है कि धारणा वास्तव में कुछ CPU परिवारों (विशेष रूप से PIC!) पर धीमी गति से फूला हुआ प्रदर्शन का कारण बनता है यह खंड x86 पर बड़ा एक चूसना था।

मूल रूप से, जब आपको एक वेक्टर इकाई, या एक समानांतर संकलक मिलता है, तो सी स्टिंक और आधुनिक फोरट्रान तेजी से चलता है।

सी प्रोग्रामर ट्रिक्स जैसे थंकिंग (मक्खी पर निष्पादन योग्य को संशोधित करना) सीपीयू प्रीफैच स्टालों का कारण बनता है।

आपको बहाव मिलता है?

और हमारा अच्छा दोस्त, x86, एक निर्देश सेट को कार्यान्वित करता है कि ये दिन वास्तविक सीपीयू वास्तुकला के लिए बहुत कम संबंध रखते हैं। छाया रजिस्टर, लोड-स्टोर ऑप्टिमाइज़र, सभी सीपीयू में। तो C तब वर्चुअल मेटल के करीब है। असली धातु, इंटेल आपको देखने नहीं देता है। (ऐतिहासिक रूप से वीएलआईडब्ल्यू सीपीयू थोड़े बहुत हलचल में थे, शायद यह इतना बुरा नहीं है।)

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

और अंत में, कुछ सीपीयू (www.ajile.com) हार्डवेयर में जावा बाइटकोड्स चलाते हैं। C उस CPU पर उपयोग करने के लिए PITA होगा।


1
आखिरी बार थंकिंग को C में कब लिखा गया है? आधुनिक x86 ज्यादातर RISC डिज़ाइन का एक इंटरफ़ेस है, लेकिन इसका VLIW के साथ बहुत कम संबंध है ...
Calyth

7
आपकी अधिकांश पोस्ट C99 की मौजूदगी को नजरअंदाज करती है। साथ ही, कई C / C ++ कंपाइलर C99 प्रतिबंधित कीवर्ड (एक्सटेंशन के बिना कोई पॉइंटर अलियासिंग सुनिश्चित करता है) प्रदान करते हैं।
इवान टेरान

मुझे लगता है कि हर कोई सीडब्ल्यूई / एसएएनएस शीर्ष 25 का अनुसरण करने के लिए / संक्रमण कर रहा है और सी में नए डिजाइन बनाने से परहेज कर रहा है। इसलिए कोई ग्रीन-फ़ील्ड सी नहीं है, इसलिए कोई सी 99 से कम नहीं।
टिम विस्क्राफ्ट

2
क्या आप उदाहरण दिखा सकते हैं जब सी आधुनिक फोर्टेनबेरी की तुलना में धीमा है?
आदम

मुझे यकीन नहीं है कि कभी ऐसा समय आया हो जब सी कंपाइलर्स ने बेहतरीन फोरट्रान कंपाइलर्स के साथ अच्छी प्रतिस्पर्धा की हो। बेशक, बहुत सारे कोड हैं जो आप फोरट्रान 77 (अकेले 66) में लिखना नहीं चाहेंगे, लेकिन अधिक हाल के फोरट्रान मानकों को तेजी से सुखद बना दिया गया है।
tfb

11

बाइनरी को संकलित करने में सक्षम होने से अन्य भाषाओं को रोकने के लिए क्या है जो हर बिट सी के रूप में तेजी से चलता है?

कुछ भी तो नहीं। जावा या .NET लैंग्स जैसी आधुनिक भाषाएं प्रदर्शन के बजाय प्रोग्रामर उत्पादकता पर अधिक उन्मुख हैं। हार्डवेयर अब सस्ते हैं। मध्यवर्ती प्रतिनिधित्व के लिए संकलन सुरक्षा, पोर्टेबिलिटी आदि जैसे बहुत सारे बोनस देता है। .NET सीएलआर विभिन्न हार्डवेयर का लाभ उठा सकता है - उदाहरण के लिए आपको एसएसई निर्देशों के सेट का उपयोग करने के लिए मैन्युअल रूप से अनुकूलित / पुन: व्यवस्थित करने की आवश्यकता नहीं है।


मैं यहाँ पोर्टेबिलिटी का तर्क दूंगा। यदि आप वास्तव में पोर्टेबल कोड चाहते हैं, तो आप इसे सी में लिखेंगे और किसी अन्य भाषा में नहीं। हमारे पास लगभग 25 ऑपरेटिंग सिस्टम पर चलने वाला एक कोड है। डॉस और थ्रेडएक्स से शुरू करना और लिनक्स / एक्सपी पर खत्म करना मुझे एक और भाषा दिखाती है जो ऐसा कर सकती है :)
इल्या

1
@ इलिया मैं असहमत हूं। सी में नॉन-पोर्टेबल कोड लिखना उतना ही आसान है, कुछ को 64-बिट में पोर्ट करना कितना दर्दनाक था। यदि आपके पास सही बाईटेकोड दुभाषिया है, तो बायटेकोड लहंगा प्लेटफॉर्म पर काम कर सकता है।
कैलिथ

1
@IIya, पोर्टेबल C कोड नियम के बजाय एक एक्साइज है, मैंने विभिन्न हार्डवेयर / सॉफ्टवेयर प्लेटफॉर्म के बीच C कोड को पोर्ट किया और यह जाना कि यह एक बुरा सपना है।
अकु

यहां तक ​​कि पीसी शब्द के लिए भी ऐसा नहीं है। वास्तविकता में देखें c / c ++ में लिखे गए क्रॉस प्लेटफॉर्म एप्लिकेशन के अधिकांश भाग, जावा में थोड़े से हैं। एम्बेडेड निचले स्तर के विकास के लिए सिर्फ एक और मामला नहीं है। सी सबसे पोर्टेबल भाषा डी वास्तविक है।
इल्या

@aku -> खराब कोड डालना आपदा से सहमत हो सकता है। ADVANCE - C में पोर्टेबल कोड लिखना सबसे अच्छा विकल्प है। मैं कहूंगा कि C ++ एक विकल्प है, लेकिन एम्बेडेड प्लेटफॉर्म पर जाने से आपको हमेशा अच्छा C कंपाइलर मिलेगा, C ++ के लिए आपको कंपाइलर के साथ सेल्फी मिल सकती है।
इल्या

8

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

ये कुछ अन्य कारक हैं जो दिमाग में आते हैं।

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

अधिकांश स्थिर-टाइप की गई भाषाओं को C की तुलना में तेज़ या तेज़ के रूप में संकलित किया जा सकता है, खासकर यदि वे यह अनुमान लगा सकें कि C सूचक अलियासिंग आदि के कारण C नहीं हो सकता है।


सी निम्न-स्तर? मुझे लगता है कि यह जावा के मुकाबले हाँ, लेकिन असेंबली नं। की तुलना में एक सापेक्ष अर्थ है। अच्छी पोस्ट, मुझे सोच में पड़ गया।
मार्क

आप सही हैं, यह निश्चित रूप से सापेक्ष है। मेरा मतलब है कि यह "मशीन के करीब" है और आपको स्मृति प्रबंधन या सरणी आकार का ट्रैक रखने जैसी चीजों को करने में मदद नहीं करता है।
मैथ्यू क्रुमले

2
C एक निम्न-स्तरीय भाषा है। C हमेशा निम्न स्तर की भाषा रही है। आप बहुत कठिनाई के बिना कोड कोड को सी-कोड में सौंप देते हैं।
रॉबर्ट सी। बर्थ

2
@ रोबर्ट: सी को उच्च स्तरीय भाषा माना जाता था क्योंकि विधानसभा (जो बहुत सामान्य थी) की तुलना में, यह थी। आज उपयोग की जाने वाली अधिकांश भाषाओं की तुलना में इसे एक निम्न-स्तरीय भाषा माना जाता है।
रॉबर्ट गैंबल

ईमानदारी से, यह एक बहुत ही पक्षपाती जवाब है। लानत है सभी C प्रोग्रामर के पास चेकिंग सीमा आदि, फिर भी C C ++ की तुलना में बहुत तेज है।
मार्कस जे।

8

मुझे लगता है कि आप भूल गए कि विधानसभा भाषा भी एक भाषा है :)

लेकिन गंभीरता से, सी प्रोग्राम तभी तेज होते हैं जब प्रोग्रामर जानता है कि वह क्या कर रहा है। आप आसानी से एक सी प्रोग्राम लिख सकते हैं जो अन्य भाषाओं में लिखे प्रोग्रामों की तुलना में धीमी गति से चलता है जो समान काम करते हैं।

सी का कारण तेज है क्योंकि यह इस तरह से डिज़ाइन किया गया है। यह आपको बहुत सारे "निचले स्तर" सामान करने की अनुमति देता है जो कंपाइलर को कोड को अनुकूलित करने में मदद करता है। या, हम कहेंगे, आप कोड को अनुकूलित करने के लिए प्रोग्रामर जिम्मेदार हैं। लेकिन यह अक्सर काफी मुश्किल और त्रुटि प्रवण होता है।

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


3
यद्यपि यदि आपने सी और असेंबली में एक बार एक कार्यक्रम लिखा था, तो सी संस्करण शायद अधिक तेज़ होगा क्योंकि कंपाइलर आपके मुकाबले अधिक स्मार्ट है।
mk12

7

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


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

तो यह सब कोड से उत्पन्न विधानसभा निर्देशों की संख्या के नीचे आता है। उच्च स्तरीय कोड के प्रति अधिक विधानसभा निर्देश हैं, जितना अधिक प्रदर्शन होता है?
ENDEESA

यह एक निरीक्षण हो सकता है, लेकिन विधानसभा निर्देशों की संख्या और कार्यक्रम की गति के बीच सीधा संबंध है। प्रत्येक निर्देश को निष्पादित करने के लिए प्रोसेसर के लिए न्यूनतम समय है। IMHO, एक भाषा जो आपको आसानी से समझने देती है कि आप कितने निर्देश लिख रहे हैं, आपको अधिक कुशल कोड लिखने में मदद करता है। (अन्य प्रोसेसर समय की लागतें हैं, जैसे ब्रांचिंग और कैश मिस हैं, लेकिन वहां भी, कम अमूर्तता यह स्पष्ट करने में मदद करती है कि सीपीयू क्या कर रहा है)।
AShelly

7

मुझे पता है कि बहुत से लोगों ने इसे लंबे घुमावदार तरीके से कहा है, लेकिन:

सी तेज है क्योंकि यह कम (आपके लिए) करता है।


यह। सी। की भावना के लिए इतना सच है
cmaster - मोनिका

7

C ++ औसत रूप से तेज़ है (जैसा कि शुरू में, मोटे तौर पर C का सुपरसेट था, हालांकि कुछ अंतर हैं)। हालांकि, विशिष्ट बेंचमार्क के लिए, अक्सर एक और भाषा होती है जो तेज होती है।

https://benchmarksgame-team.pages.debian.net/benchmarksgame/

fannjuch-redux स्काला में सबसे तेज था

n-bodyऔर fastaआदा में तेज थे।

spectral-norm फोरट्रान में सबसे तेज था।

reverse-complement, mandelbrotऔर pidigitsएटीएस में सबसे तेज थे।

regex-dna जावास्क्रिप्ट में सबसे तेज था।

chameneou-redux सबसे तेज जावा 7 था।

thread-ring हास्केल में सबसे तेज़ था।

बाकी बेंचमार्क C या C ++ में सबसे तेज थे।


"चूँकि यह C का सुपर सेट है" - नहीं, C ++, C का सुपरसेट नहीं है
PP

1
extern "C"कुछ भी नहीं ++ एक जा रहा है सी के साथ क्या करना है सुपरसेट सी
पीपी

2
यह system("bash script.sh");किसी भी बैश स्क्रिप्ट के लिए काम करने जैसा है , और इसलिए C, बैश का सुपरसेट है। extern "C"नामकरण के कारण C ++ में C लिंकेज प्रदान करता है। जबकि X को Y के सुपरसेट के रूप में बुलाने का मतलब है कि Y में किया जा सकता है कुछ भी X में किया जा सकता है, जो C ++ का सच नहीं है। कुछ भाषा निर्माण ऐसे हैं जो C में मान्य हैं लेकिन C ++ में नहीं।
पीपी

1
@PP C ++ मानक में ऐसा कुछ भी नहीं है जो यह बताता है कि bashएक उपलब्ध कमांड लाइन प्रोग्राम है। यदि यह किया गया और इसमें शामिल है कि बैश के किस संस्करण / विनिर्देश का समर्थन करने की आवश्यकता है, तो मैं इसे सुपरसेट मानूंगा।
पीटर लॉरी

1
यह सी कोड लिखने के लिए बहुत आसान है, जो सी ++ कोड नहीं है, जैसेstruct foo { int: this; }; typedef float foo;
जैसन

6

इनमें से कई जवाब सी के लिए वैध कारण देते हैं, या नहीं है, तेज (या तो सामान्य या विशिष्ट परिदृश्य में)। यह निर्विवाद है कि:

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

इस सब के बावजूद, मैंने देखा है कि कुछ और है, मुझे लगता है कि सी बनाम कई अन्य भाषाओं के तुलनात्मक प्रदर्शन को किसी भी अन्य कारक से बहुत अधिक प्रभावित करता है। अर्थात:

अन्य भाषाओं में अक्सर कोड लिखना आसान होता है जो अधिक धीरे-धीरे निष्पादित होता है। अक्सर, यह भाषा के डिजाइन दर्शन द्वारा भी प्रोत्साहित किया जाता है। कोरोलरी: एक सी प्रोग्रामर कोड लिखने की अधिक संभावना है जो अनावश्यक संचालन नहीं करता है।

उदाहरण के रूप में, एक साधारण विंडोज प्रोग्राम पर विचार करें जिसमें एक एकल मुख्य विंडो बनाई गई है। एसी संस्करण एक WNDCLASS[EX]संरचना को पॉप्युलेट करेगा जिसे पास किया जाएगा RegisterClass[Ex], फिर कॉल करें CreateWindow[Ex]और एक संदेश लूप दर्ज करें । अत्यधिक सरलीकृत और संक्षिप्त कोड निम्नानुसार है:

WNDCLASS wc;
MSG      msg;

wc.style         = 0;
wc.lpfnWndProc   = &WndProc;
wc.cbClsExtra    = 0;
wc.cbWndExtra    = 0;
wc.hInstance     = hInstance;
wc.hIcon         = NULL;
wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName  = NULL;
wc.lpszClassName = "MainWndCls";

RegisterClass(&wc);

CreateWindow("MainWndCls", "", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
             CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

while(GetMessage(&msg, NULL, 0, 0)){
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

C # में एक समतुल्य कार्यक्रम कोड की सिर्फ एक पंक्ति हो सकती है:

Application.Run(new Form());

कोड की यह एक पंक्ति सभी कार्यक्षमता प्रदान करती है जो C कोड की लगभग 20 पंक्तियों ने की थी, और कुछ चीजें जो हमने बाहर छोड़ दी थीं, जैसे त्रुटि जाँच। अमीर, फुलर लाइब्रेरी (एक विशिष्ट सी परियोजना में इस्तेमाल किए गए लोगों की तुलना में) ने हमारे लिए बहुत काम किया, कोड के कई और अधिक स्निपेट लिखने के लिए अपना समय खाली कर दिया जो हमें कम लगते हैं लेकिन पर्दे के पीछे कई चरणों को शामिल करते हैं।

लेकिन आसान और त्वरित कोड ब्लोट को सक्षम करने वाला एक समृद्ध पुस्तकालय वास्तव में मेरी बात नहीं है। मेरी बात तब और स्पष्ट होती है जब आप जांचना शुरू करते हैं कि वास्तव में क्या होता है जब हमारे छोटे से एक-लाइनर वास्तव में निष्पादित होते हैं। मज़ेदार समय के लिए, Visual Studio 2008 या उच्चतर में .NET स्रोत का उपयोग सक्षम करें , और ऊपर दिए गए सरल एक-पंक्ति में कदम रखें। मज़ेदार छोटे रत्नों में से एक जो आप भर में आएंगे, उसके लिए इस टिप्पणी में है Control.CreateParams:

// In a typical control this is accessed ten times to create and show a control.
// It is a net memory savings, then, to maintain a copy on control.
// 
if (createParams == null) {
    createParams = new CreateParams(); 
} 

दस बार । जानकारी मोटे तौर पर क्या एक में संग्रह किया गया है की राशि के बराबर WNDCLASSEXसंरचना और क्या करने के लिए पारित किया है CreateWindowExसे लिया गया है Controlवर्ग में दस गुना से पहले यह एक में संग्रह किया गया है WNDCLASSEXसंरचना और को दे दिया RegisterClassExऔर CreateWindowEx

सभी में, इस बहुत ही मूल कार्य को करने के लिए निष्पादित निर्देशों की संख्या सी में # की तुलना में सी # में परिमाण के 2 से 3 आदेश हैं। इसका एक हिस्सा एक सुविधा संपन्न पुस्तकालय के उपयोग के कारण है, जो आवश्यक रूप से सामान्यीकृत है, बनाम। हमारा साधारण सी कोड जो हमें वही चाहिए जो और कुछ नहीं चाहिए। लेकिन इसका एक हिस्सा इस तथ्य के कारण है कि .NET फ्रेमवर्क की मॉड्यूलर, ऑब्जेक्ट-ओरिएंटेड प्रकृति, खुद को निष्पादन के बहुत पुनरावृत्ति के लिए उधार देती है जो अक्सर एक प्रक्रियात्मक दृष्टिकोण से बचा जाता है।

मैं C # या .NET ढाँचे को चुनने की कोशिश नहीं कर रहा हूँ। न ही मैं यह कह रहा हूं कि मॉडर्नाइजेशन, सामान्यीकरण, पुस्तकालय / भाषा की विशेषताएं, ओओपी, आदि बुरी चीजें हैं । मैं अपना अधिकांश विकास C में करता था, बाद में C ++ में, और हाल ही में C # में करता था। इसी तरह, सी से पहले, मैंने ज्यादातर असेंबली का इस्तेमाल किया। और प्रत्येक चरण "उच्च" के साथ मेरी भाषा जाती है, मैं कम समय में बेहतर, अधिक बनाए रखने योग्य, अधिक मजबूत कार्यक्रम लिखता हूं। हालांकि, वे थोड़ा और धीरे-धीरे निष्पादित करते हैं।


2
यह एक एपीआई मुद्दा है, न कि भाषा का मुद्दा।
अरफांगियन

1
@ प्रारूप: मैं समझता हूँ कि आप क्या कह रहे हैं, लेकिन इस तरह की बात याद आती है। सुविधा संपन्न भाषा से सक्षम पुस्तकालय (और, एक तरह से, मांग की गई) है। और यह सिर्फ पुस्तकालय नहीं है। पुस्तकालय भाषा के सामान्य उपयोग का एक उदाहरण है। किसी भी भाषा में विशिष्ट एप्लिकेशन कोड आमतौर पर उस भाषा में आमतौर पर उपयोग किए जाने वाले पुस्तकालयों के समान होता है। यह वास्तव में भाषा से प्रेरित मानसिकता का अधिक है। उदाहरण के लिए, OO भाषाएँ आम तौर पर कम OOP समर्थन वाली भाषाओं की तुलना में वस्तुओं के आवंटन, निर्माण, विनाश, और निपटने में अधिक समय व्यतीत करती हैं।
पी डैडी

मैं मानता हूं कि आम तौर पर भाषा का एक दिया गया विकल्प एक विशेष मंच और पुस्तकालय का अर्थ है, यही कारण है कि मैंने वह टिप्पणी की है (ताकि पाठक अधिक जागरूक हो), लेकिन उसने कहा, उदाहरण के लिए (उदाहरण के लिए) विंडोज़ पर सी ++ एक है बहुत अलग जानवर, लिनक्स पर C ++, और Android पर C ++ के साथ फिर से अलग। एक अन्य उदाहरण पायथन है - हमारे पास CPython, Jython, PyPy, और IronPython हैं - ये सभी बहुत अलग-अलग पुस्तकालयों का उपयोग करते हैं।
अराफांजियन

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

6

मुझे नहीं लगता कि किसी ने इस तथ्य का उल्लेख किया है कि किसी अन्य संकलक की तुलना में बहुत अधिक प्रयास सी कंपाइलरों में डाले गए हैं, शायद जावा के अपवाद के साथ।

C पहले से बताए गए कई कारणों से बेहद अनुकूल है - लगभग किसी भी अन्य भाषा से अधिक। इसलिए यदि उसी प्रयास को अन्य भाषा संकलकों में रखा जाए, तो C संभवतः शीर्ष पर आ जाएगा।

मुझे लगता है कि कम से कम एक उम्मीदवार की भाषा है कि प्रयास के साथ सी से बेहतर अनुकूलित किया जा सकता है और इस प्रकार हम ऐसे कार्यान्वयन देख सकते हैं जो तेजी से बायनेरिज़ का उत्पादन करते हैं। मैं डिजिटल मार्स डी के बारे में सोच रहा हूं क्योंकि निर्माता ने एक ऐसी भाषा बनाने का ध्यान रखा है जो संभवतः सी से बेहतर अनुकूलित हो सकती है। ऐसी अन्य भाषाएं भी हो सकती हैं जिनकी यह संभावना है। हालाँकि मैं सोच भी नहीं सकता कि किसी भी भाषा में सबसे अच्छा C कंपाइलर की तुलना में बस कुछ प्रतिशत अधिक तेजी से कम्पाइलर होंगे। मैं गलत होना पसंद करूंगा।

मुझे लगता है कि असली "कम लटके हुए फल" उन भाषाओं में होंगे जो मनुष्यों के अनुकूलन के लिए आसान हैं। एक कुशल प्रोग्रामर किसी भी भाषा को तेजी से आगे बढ़ा सकता है - लेकिन कभी-कभी आपको ऐसा करने के लिए हास्यास्पद चीजें करनी पड़ती हैं या अप्राकृतिक निर्माण का उपयोग करना पड़ता है। यद्यपि यह हमेशा प्रयास करेगा, एक अच्छी भाषा को अपेक्षाकृत तेज कोड का उत्पादन करना चाहिए, बिना इस बात पर ध्यान दिए कि कार्यक्रम कैसे लिखा जाता है।

यह भी महत्वपूर्ण है (कम से कम मेरे लिए) कि सबसे खराब स्थिति कोड जल्दी हो जाता है। वेब पर कई "सबूत" हैं कि जावा सी की तुलना में तेज या तेज है, लेकिन यह चेरी के उदाहरणों पर आधारित है। मैं C का बहुत बड़ा प्रशंसक नहीं हूं, लेकिन मुझे पता है कि C में जो कुछ भी मैं लिखता हूं वह अच्छी तरह से चलने वाला है। जावा के साथ यह "संभवतः" गति के 15% के भीतर चलेगा, आमतौर पर 25% के भीतर लेकिन कुछ मामलों में यह कहीं अधिक खराब हो सकता है। किसी भी मामले में जहां यह बस के रूप में तेजी से या कुछ प्रतिशत के भीतर होता है, आमतौर पर लाइब्रेरी कोड में बिताए जाने वाले अधिकांश समय के कारण होता है जो कि वैसे भी भारी रूप से अनुकूलित होता है।


5

यह वास्तव में एक झूठा झूठ का एक सा है। हालांकि यह सच है कि C प्रोग्राम अक्सर तेज होते हैं, यह हमेशा ऐसा नहीं होता है, खासकर अगर C प्रोग्रामर इसमें बहुत अच्छा नहीं है।

एक बड़ा चकाचौंध छेद जिसे लोग भूल जाते हैं वह यह है कि कार्यक्रम को किसी प्रकार के IO के लिए ब्लॉक करना है, जैसे कि किसी GUI प्रोग्राम में उपयोगकर्ता इनपुट। इन मामलों में, यह वास्तव में मायने नहीं रखता है कि आप किस भाषा का उपयोग करते हैं क्योंकि आप उस दर से सीमित होते हैं जिस पर डेटा के बजाय आप इसे कितनी तेजी से संसाधित कर सकते हैं। इस स्थिति में, यदि आप C, Java, C # या यहां तक ​​कि पर्ल का उपयोग कर रहे हैं, तो यह बहुत मायने नहीं रखता है; आप डेटा के अंदर आने से किसी भी तेजी से नहीं जा सकते।

दूसरी प्रमुख बात यह है कि कचरा संग्रह का उपयोग करना और उचित पॉइंटर्स का उपयोग नहीं करना वर्चुअल मशीन को अन्य भाषाओं में उपलब्ध नहीं होने वाले कई अनुकूलन करने की अनुमति देता है। उदाहरण के लिए, JVM वस्तुओं को इधर-उधर करने में सक्षम है ताकि इसे डीफ़्रैग्मेन्ट किया जा सके। यह भविष्य के आवंटन को बहुत तेज़ बनाता है क्योंकि अगले सूचकांक को केवल तालिका में देखने के बजाय इसका उपयोग किया जा सकता है। आधुनिक JVM को भी वास्तव में मेमोरी को नहीं हटाना है; इसके बजाय, वे बस जीसी वस्तुओं को इधर-उधर ले जाते हैं जब वे जीसी और मृत वस्तुओं से खर्च की गई मेमोरी अनिवार्य रूप से मुफ्त में बरामद करते हैं।

यह भी C के बारे में एक दिलचस्प बिंदु लाता है और C ++ में भी अधिक। "अगर आपको इसकी आवश्यकता नहीं है, तो आप इसके लिए भुगतान नहीं करते हैं" समस्या यह है कि यदि आप इसे चाहते हैं, तो आप इसके लिए नाक के माध्यम से भुगतान करते हैं। उदाहरण के लिए, जावा में vtable कार्यान्वयन C ++ कार्यान्वयन की तुलना में बहुत बेहतर हो जाता है, इसलिए वर्चुअल फ़ंक्शन कॉल बहुत तेज़ होते हैं। दूसरी ओर, आपके पास जावा में वर्चुअल फ़ंक्शंस का उपयोग करने के अलावा कोई विकल्प नहीं है और वे अभी भी कुछ खर्च करते हैं, लेकिन ऐसे कार्यक्रमों में जो बहुत सारे वर्चुअल फ़ंक्शंस का उपयोग करते हैं, कम लागत में वृद्धि होती है।


1
"जावा में व्यवहार्य कार्यान्वयन C ++ कार्यान्वयन की तुलना में बहुत बेहतर होता है, इसलिए वर्चुअल फ़ंक्शन कॉल बहुत तेज़ होते हैं।" पृथ्वी पर आप MOV EAX, [ECX] की तुलना में कितनी तेजी से जा सकते हैं; कॉल [EAX + someindex]; ? जब तक आप इसे देखे बिना किसी फ़ंक्शन को कॉल कर सकते हैं, यह बहुत इष्टतम लगता है।
फ्रैंस-विलेम

@Frans - एक JIT कंपाइलर (जैसे कि जावा हॉटस्पॉट) वाइबेट लुकअप को इनलाइन कर सकता है यदि यह निर्धारित करता है कि किसी दिए गए ऑब्जेक्ट हमेशा दिए गए प्रकार के होते हैं। अगर यह संकलन-समय पर समान जानकारी जानता है तो C ++ भी ऐसा करेगा, लेकिन यह x86 मशीन निर्देशों की तुलना में जावा बाइटकोड के साथ इस अनुकूलन को करना आसान है।
टॉम

6
@James - "I / O प्रदर्शन मामले को कम करता है" तर्क देते हुए "C अन्य भाषाओं की तुलना में तेज़ है" कथन को अमान्य नहीं करता है। यह एक चमकता हुआ छेद नहीं है, यह एक स्ट्रोमैन तर्क है।
टॉम

एक उदाहरण के रूप में, सी के स्ट्रिंग हैंडलिंग (और मानक सी लाइब्रेरी के) का उपयोग करना बेहतर होता, क्योंकि यह एक ऐसा क्षेत्र है जहां सी खराब है। अधिकांश अन्य भाषाएं बेहतर करती हैं, यहां तक ​​कि सरल शुरुआत कोड के साथ भी।
डोनल फैलो

@DonalFellows मेम * फ़ंक्शन कुछ कार्यों पर str * फ़ंक्शन से अधिक तेज़ हो सकता है, लेकिन यदि देखभाल की जाए तो स्ट्रिंग हैंडलिंग कुशल है। क्या आपके मन में एक विशिष्ट बेंचमार्क है?
जसेंन

4

यह उपकरण और पुस्तकालयों के रूप में भाषा के बारे में इतना नहीं है। सी के लिए उपलब्ध पुस्तकालय और संकलक नई भाषाओं की तुलना में बहुत पुराने हैं। आप सोच सकते हैं कि यह उन्हें धीमा कर देगा, लेकिन औ गर्भनिरोधक।

इन पुस्तकालयों को ऐसे समय में लिखा गया था जब प्रसंस्करण शक्ति और स्मृति प्रीमियम पर थी। उन्हें काम करने के लिए बहुत कुशलता से लिखा जाना था । सी कंपाइलर्स के डेवलपर्स को विभिन्न प्रोसेसर के लिए सभी प्रकार की चतुर अनुकूलन में काम करने के लिए एक लंबा समय मिला है। सी की परिपक्वता और व्यापक रूप से गोद लेने से उसी उम्र की अन्य भाषाओं पर हस्ताक्षर करने का लाभ मिलता है। यह C को नए उपकरणों पर एक गति का लाभ देता है जो कच्चे प्रदर्शन पर जोर नहीं देते हैं जितना कि C को करना था।


4

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


4

पुराने "सी / सी ++ देखने के लिए अद्भुत जावा की तुलना में तेज होना चाहिए क्योंकि जावा की व्याख्या की गई है" मिथक अभी भी जीवित है और किकिंग कर रहा है। कर रहे हैं कि कुछ साल वापस जा रहा लेख के रूप में, साथ ही अधिक हाल ही में लोगों को , कि अवधारणाओं या माप के साथ स्पष्टीकरण दें कि यह बस हमेशा ऐसा नहीं होता

वर्तमान आभासी मशीन कार्यान्वयन (और न केवल JVM, वैसे) कार्यक्रम निष्पादन के दौरान एकत्रित जानकारी का लाभ गतिशील रूप से कोड को धुन करने के लिए कर सकता है क्योंकि यह विभिन्न तकनीकों का उपयोग करता है:

  • मशीन कोड के लिए लगातार तरीकों का प्रतिपादन,
  • छोटे तरीकों की आवक,
  • लॉकिंग का समायोजन

और कोड को वास्तव में क्या कर रहा है, यह जानने के आधार पर और यह चल रहा है कि पर्यावरण की वास्तविक विशेषताओं पर आधारित विभिन्न समायोजन


मैं मानता हूँ कि जावा पिछले कुछ वर्षों है कि यह बहुत सी के करीब कच्चे प्रदर्शन के मामले में लाने पर महत्वपूर्ण प्रदर्शन में सुधार किया है, लेकिन यह सच है कि यह था नीचे रहने के लिए एक समय लगेगा इसलिए के लिए धीमी गति से इतना लंबा। लेकिन जावा के बारे में वैसे भी कौन बात कर रहा था?
रॉबर्ट गैंबल

जावा ओपी द्वारा संदर्भित एक "अन्य भाषा" है, है ना?
रॉबर्ट सी। बार्थ

@ रॉबर्ट: "अन्य भाषाएं", बहुवचन, सी के अलावा किसी भी विशिष्ट भाषा का कोई उल्लेख नहीं है। आप संभवतः इससे "जावा" कैसे पढ़ते हैं?
रॉबर्ट गैंबल

@ रॉबर्ट: मेरे द्वारा प्रश्न का सामना करने से पहले पोस्ट किए गए कई उत्तर जावा (या अन्य भाषाओं के बारे में बात कर रहे थे, जिनका कार्यान्वयन अक्सर दुभाषिया या वीएम के माध्यम से होता है)।
joel.neely

3
@Joel - यदि आप अपने लक्ष्य हार्डवेयर को जानते हैं, तो JVM रनटाइम पर कर सकते हैं, अधिकांश अनुकूलन C या C ++ के साथ प्रोफ़ाइल-निर्देशित अनुकूलन का उपयोग करके भी किया जा सकता है। इससे भारी अंतर पड़ता है, और आम तौर पर सी और सी ++ को पीछे धकेल दिया जाता है, क्योंकि उन्हें निष्पादित करते समय "सीखना" नहीं पड़ता है।
टॉम

4

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


आपके उत्तर को पढ़ते हुए, पूरे पैराग्राफ में सिर्फ दो शब्द मेरी आँखों को उनकी ओर खींच रहे थे, जैसे एक चुंबक धातु खींच रहा हो। शब्द JAVA है, दो बार पैरा में। सभी कैप्स में लिखे जाने से पहले इसे कभी नहीं देखा, और यह बहुत अच्छा लग रहा है :-)
SANƒошӽа before

3

इसके लिए किसी का शब्द न लें, अपने कोड के किसी भी प्रदर्शन महत्वपूर्ण हिस्से में C और आपकी भाषा दोनों के लिए असहमति को देखें। मुझे लगता है कि आप बस disassembled .Net देखने के लिए Visual Studio में रनटाइम पर disassembly विंडो में देख सकते हैं। यदि विंडबग का उपयोग करके जावा के लिए मुश्किल हो सकता है, हालांकि यदि आप इसे .Net के साथ करते हैं तो कई मुद्दे समान होंगे।

मुझे C में लिखना पसंद नहीं है, अगर मुझे इसकी आवश्यकता नहीं है, लेकिन मुझे लगता है कि इन उत्तरों में किए गए कई दावे हैं जो C के अलावा अन्य भाषाओं की गति को टाल देते हैं, C में समान दिनचर्या को असम्बद्ध करके अलग रखा जा सकता है और अपनी पसंद की उच्च स्तरीय भाषा में, खासकर यदि बहुत सारा डेटा शामिल है जैसा कि प्रदर्शन महत्वपूर्ण अनुप्रयोगों में आम है। फोरट्रान अपने विशेषज्ञता के क्षेत्र में एक अपवाद हो सकता है, पता नहीं। क्या यह C से ऊँचा स्तर है?

पहली बार मैंने JITed कोड की तुलना देशी कोड के साथ की थी। किसी भी और सभी सवालों को हल किया है। अमूर्त का अतिरिक्त स्तर और सभी सुरक्षा जांच एक महत्वपूर्ण लागत के साथ आते हैं। समान लागत संभवतः जावा पर लागू होगी, लेकिन इसके लिए मेरा शब्द न लें, इसे उस चीज़ पर आज़माएं जहां प्रदर्शन महत्वपूर्ण है। (किसी को याद में संकलित प्रक्रिया का पता लगाने के लिए JITed Java के बारे में पर्याप्त पता है; यह निश्चित रूप से संभव होना चाहिए)


2

1) जैसा कि दूसरों ने कहा है, C आपके लिए कम करता है। कोई प्रारंभिक चर, कोई सरणी सीमा जाँच, कोई स्मृति प्रबंधन, आदि। अन्य भाषाओं में उन सुविधाओं की स्मृति और CPU चक्र खर्च होते हैं जो C खर्च नहीं करते हैं।

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


2

अच्छे दिनों में वापस, केवल दो प्रकार की भाषाएं थीं: संकलित और व्याख्या की गई।

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

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

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

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

पॉल।


"सी में, यदि आप एक पूर्णांक बढ़ाते हैं, तो यह संभावना से अधिक है कि यह सीपीयू में केवल एक कोडांतरक कदम है" बिल्कुल सच नहीं है। यदि यह पूर्णांक सीपीयू रजिस्टर में नहीं है, तो आपको मेमोरी से इसे प्राप्त करने के लिए मशीन कोड की आवश्यकता होगी, इसे बढ़ाएं, इसे मेमोरी में वापस लिखें। जावा कोड को चलाने पर उसी के बारे में उम्मीद की जाएगी। और मुझे यह विचार नहीं है कि "++ i" अपने आप में एक जीसी चक्र क्यों होगा।
क्वांट_देव

@quant_dev: "आपके पास ... स्मृति से प्राप्त करने के लिए, इसे बढ़ाएँ, इसे वापस लिखें ..."। शायद शायद नहीं। उदाहरण के लिए, x86 में ऐसे निर्देश हैं जो मेमोरी में डेटा पर काम करते हैं। ++i"जोड़ने के लिए संकलन कर सकते हैं [ebp - 8], 1"। ऐसा नहीं है कि लाने के लिए, वेतन वृद्धि, स्टोर अभी भी नहीं हो रहा है, लेकिन यह सीपीयू द्वारा ध्यान रखा जाता है, और पॉल ने कहा कि सिर्फ एक निर्देश है।
पी डैडी

... जो अभी भी प्रदर्शन के पीओवी से अप्रासंगिक है, क्योंकि यह सिर्फ एक निर्देश हो सकता है, लेकिन अभी भी सीपीयू तक पहुंचने के लिए डेटा का इंतजार करना शामिल है। कैश की याद आती है और वह सब।
क्वांट_देव

नहीं, मैं यह नहीं कहूंगा कि यह अप्रासंगिक है। एक सीपीयू निर्देश आमतौर पर कई सीपीयू निर्देशों की तुलना में कम कोड बाइट्स पर कब्जा कर लेता है, कोड सेगमेंट पर बेहतर कैश प्रदर्शन करता है। एक सीपीयू निर्देश भी सीपीयू की पाइपलाइन पर कम जगह लेता है, और अलग-अलग पाइपलाइन चरणों द्वारा कई चरणों (लाने, वृद्धि, स्टोर) को संभाला जा सकता है-शायद समानांतर में। वास्तव में, एक ऑपरेशन के कुछ हिस्सों को भी छोड़ दिया जा सकता है अगर उन्हें पाइपलाइन पर अन्य संचालन के साथ पिघलाया जा सकता है। उदाहरण के लिए, एक मान को संग्रहीत करना उसी मूल्य के बाद के लोडिंग के साथ पिघलाया जा सकता है।
पी डैडी

2

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

शायद सबसे स्पष्ट अप्रत्यक्ष स्मृति संदर्भों पर वैधता जाँच है - जैसे कि nullसरणी सीमाओं के विरुद्ध सूचक की जाँच करना और अनुक्रमित करना। अधिकांश उच्च-स्तरीय भाषाएँ इन जाँचों को अंतर्निहित रूप से निष्पादित करती हैं, लेकिन C नहीं करता है। हालांकि, यह जरूरी नहीं कि इन अन्य भाषाओं की एक मौलिक सीमा है - एक पर्याप्त रूप से चतुर कंपाइलर इन चेकों को एल्गोरिथ्म के आंतरिक छोरों से कुछ प्रकार के लूप-इनवेरिएंट कोड मोशन के माध्यम से निकालने में सक्षम हो सकता है

C का अधिक मौलिक लाभ (और कुछ हद तक समान रूप से संबंधित C ++) स्टैक-आधारित मेमोरी आवंटन पर भारी निर्भरता है , जो आवंटन, डील-डौल और पहुँच के लिए स्वाभाविक रूप से तेज़ है । C (और C ++) में प्राथमिक कॉल स्टैक का उपयोग प्रिमिटिव, सरणियों और समुच्चय ( struct/ class) के आवंटन के लिए किया जा सकता है ।

जबकि सी , मनमाने ढंग से आकार और जीवनकाल (तथाकथित 'हीप' का उपयोग करके) की स्मृति को गतिशील रूप से आवंटित करने की क्षमता प्रदान करता है , ऐसा करने से डिफ़ॉल्ट रूप से बचा जाता है (इसके बजाय स्टैक का उपयोग किया जाता है)।

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


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


1
सी के इस मेमोरी आवंटन लाभ में से कुछ को शायद अन्य भाषाओं में भी चतुर कंपाइलरों द्वारा दोहराया जा सकता है ( यहां देखें )। मुझे यह आभास मिलता है, हालांकि, यह किसी भी तरह से संरचनात्मक रूप से बहुत मुश्किल है - विशेष रूप से गैर-आदिम डेटा प्रकारों के लिए। इस पोस्ट में एक गैर-भागने वाली वस्तु के विचार का उल्लेख है जिसे जावा में अनुकूलन के रूप में स्टैक-आबंटित किया जा सकता है।
नोबार

2

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

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

यह सवाल उठता है: क्यों? यह सी ++ और फोरट्रान के बारे में क्या है जो उन्हें तेजी से बनाते हैं, और वे अन्य लोकप्रिय भाषाओं, जैसे जावा या पायथन से बेहतर प्रदर्शन क्यों करते हैं?

बनाम संकलन की व्याख्या करना प्रोग्रामिंग भाषाओं को वर्गीकृत करने और परिभाषित करने के कई तरीके हैं, प्रोग्रामिंग की शैली के अनुसार वे प्रोत्साहित करते हैं और वे पेश करते हैं। जब प्रदर्शन को देखते हैं, तो सबसे बड़ी एकल व्याख्या भाषाओं और संकलित भाषाओं के बीच होती है।

विभाजन कठिन नहीं है; बल्कि, एक स्पेक्ट्रम है। एक छोर पर, हमारे पास पारंपरिक संकलित भाषाएं हैं, एक समूह जिसमें फोरट्रान, सी और सी ++ शामिल हैं। इन भाषाओं में, एक असतत संकलन चरण है जो प्रोग्राम के स्रोत कोड को एक निष्पादन योग्य रूप में अनुवाद करता है जिसे प्रोसेसर उपयोग कर सकता है।

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

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

दरअसल कोड निष्पादित करना बाद में होता है। संपूर्ण संकलन प्रक्रिया का उपयोग केवल कुछ बनाने के लिए किया जाता है जिसे निष्पादित किया जा सकता है।

विपरीत छोर पर, हमारे पास व्याख्याकार हैं। व्याख्याताओं में संकलक के समान एक पार्सिंग चरण शामिल होगा, लेकिन इसके बाद प्रत्यक्ष निष्पादन को चलाने के लिए उपयोग किया जाता है, कार्यक्रम तुरंत चलाया जा रहा है।

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

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

तो इससे प्रदर्शन पर फर्क क्यों पड़ता है? सामान्य तौर पर, अप्रत्यक्ष की प्रत्येक परत प्रदर्शन को कम करती है। उदाहरण के लिए, दो नंबरों को जोड़ने का सबसे तेज़ तरीका प्रोसेसर में रजिस्टरों में उन दोनों नंबरों का होना है, और प्रोसेसर के एड अनुदेश का उपयोग करना है। यही संकलित कार्यक्रम कर सकते हैं; वे चर को रजिस्टरों में डाल सकते हैं और प्रोसेसर के निर्देशों का लाभ उठा सकते हैं। लेकिन व्याख्या किए गए कार्यक्रमों में, उसी जोड़ को जोड़ने के लिए मूल्यों को लाने के लिए चर की एक तालिका में दो लुकअप की आवश्यकता हो सकती है, फिर इसके अलावा प्रदर्शन करने के लिए एक फ़ंक्शन को कॉल करना। यह फ़ंक्शन बहुत ही अच्छी तरह से प्रोसेसर निर्देश का उपयोग कर सकता है क्योंकि संकलित कार्यक्रम वास्तविक अतिरिक्त प्रदर्शन करने के लिए उपयोग करता है, लेकिन अनुदेश का उपयोग करने से पहले सभी अतिरिक्त काम वास्तव में चीजों को धीमा कर देता है।

यदि आप अधिक जानना चाहते हैं तो कृपया स्रोत की जाँच करें


1

कुछ C ++ एल्गोरिदम C से तेज हैं, और अन्य भाषाओं में एल्गोरिदम या डिजाइन पैटर्न के कुछ कार्यान्वयन C से तेज हो सकते हैं।

जब लोग कहते हैं कि सी तेज है, और फिर किसी अन्य भाषा के बारे में बात करने के लिए आगे बढ़ते हैं, तो वे आम तौर पर सी के प्रदर्शन को एक बेंचमार्क के रूप में उपयोग कर रहे हैं।


2
"कुछ C ++ एल्गोरिदम C की तुलना में तेज़ हैं" इसका कोई मतलब नहीं है। किसी भी "सी ++ एल्गोरिथ्म" को सी और इसके विपरीत लिखा जा सकता है। एल्गोरिदम भाषा अज्ञेय हैं। C ++ अनिवार्य रूप से C में सुविधाएँ जोड़ता है - और इन नई विशेषताओं में से कोई भी तेज एल्गोरिदम को आगे नहीं बढ़ाता है (हालांकि वे लिखना आसान है)।
जोसफ गार्विन

1
क्लासिक फटकार एसटीडी है: सॉर्ट एल्गोरिथ्म .. एसटीडी :: सॉर्ट सी में किसी भी तरह के एल्गोरिदम की तुलना में तेज है - सी में एक ही प्रदर्शन प्राप्त करने का एकमात्र तरीका यह है कि आप जहां चाहते हैं या मैक्रोज़ का उपयोग करें - और फिर भी कंपाइलर को ऑप्टिमाइज़ करने की कम जानकारी होती है।
अराफंगियन

1

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

जेफ और जोएल ने सी को "वास्तविक प्रोग्रामर" भाषा होने के बारे में बात की है क्योंकि सी में कोई हाथ नहीं है। आपको अपनी खुद की मेमोरी आवंटित करनी चाहिए, उस मेमोरी को निपटाना होगा, अपनी खुद की सीमा-जाँच करना होगा, आदि ऐसी कोई बात नहीं है। नई वस्तु के रूप में (); कोई कचरा संग्रह, कक्षाएं, OOP, इकाई चौखटे, LINQ, गुण, गुण, फ़ील्ड या ऐसा कुछ भी नहीं है। आपको पॉइंटर अंकगणित और पॉइंटर को कैसे डिरेल करना है जैसी चीजों को जानना होगा। और, उस मामले के लिए, एक पॉइंटर क्या है, इसे जानें और समझें। आपको यह जानना होगा कि स्टैक फ्रेम क्या है और इंस्ट्रक्टर पॉइंटर क्या है। आपको उस सीपीयू आर्किटेक्चर के मेमोरी मॉडल को जानना होगा, जिस पर आप काम कर रहे हैं। एक माइक्रो कंप्यूटर की वास्तुकला (आमतौर पर) की बहुत अधिक अंतर्निहित समझ है कीजब आप C पर प्रोग्रामिंग कर रहे हों तो माइक्रो कंप्यूटर (जो आप पर काम कर रहे हैं) C # या Java जैसी किसी चीज़ में प्रोग्रामिंग करते समय बस मौजूद नहीं है और न ही आवश्यक है। उस जानकारी को कंपाइलर (या वीएम) प्रोग्रामर को ऑफ-लोड किया गया है।


"समस्या पर और अधिक हार्डवेयर" केवल उन वातावरणों में काम करता है जहां यह वास्तव में संभव है। एम्बेडेड बाजार एक आदर्श काउंटर-उदाहरण है (और यह एक बड़े पैमाने पर बाजार है)।
बॉब सोमरस

जेफ और जोएल ब्लॉग पूरी तरह से व्यापार प्रणालियों के बारे में है, एम्बेडेड सिस्टम नहीं है, इसलिए यह मान लेना उचित है कि यह वह संदर्भ है जिसमें यह प्रश्न पूछा गया था।
रॉबर्ट सी। बैर्थ

1) .नेट कोड जितनी तेजी से सी कोड चल रहा है? क्या आपने वास्तव में सी प्रोग्राम लिखा है? 2) "समस्या पर अधिक हार्डवेयर फेंकें" मानसिकता यह है कि मेरी 1.3 गीगाहर्ट्ज़ दोहरे कोर 2 जीबी मशीन विंडोज एक्सपी के साथ बमुश्किल रख सकती है जबकि मेरी 800MHz 512MB मशीन उबंटू के नवीनतम संस्करण के साथ उड़ती है।
रॉबर्ट गैंबल

हां, मैंने सी लिखा है। यह उतना शानदार नहीं है जितना लोग इसे बनाते हैं। और परियोजनाओं की लागत बहुत ज्यादा है। यह अर्थशास्त्र का एक साधारण मामला है। मैंने Win2k को एक पेंटियम प्रो 180MHz पर 768MB रैम के साथ एक मेल और वेब सर्वर के रूप में सालों तक चलाया। यह ठीक चला। उपाख्यान प्रमाण का अर्थ कुछ भी नहीं है।
रॉबर्ट सी। बर्थ

C "शानदार" नहीं है, लेकिन यह तेज़ है, मैंने यह जानने के लिए पर्याप्त C और C # कोड लिखा है कि C समान कार्य करते हुए C # की तुलना में लगभग हमेशा बहुत तेज़ है। कुछ कार्यों के लिए उच्च-स्तरीय भाषाओं की तुलना में इसे विकसित करने में अधिक समय लगता है, लेकिन यह नौकरी के लिए सही उपकरण का उपयोग करने के बारे में है और कभी-कभी सी है।
रॉबर्ट गैंबल

1

यह स्वचालित और मैनुअल के बीच अंतर है, उच्च स्तर की भाषाएं इस प्रकार स्वचालित हैं। C / C ++ मैन्युअल रूप से नियंत्रित और नियंत्रित किया जाता है, यहां तक ​​कि त्रुटि जाँच कोड भी कभी-कभी एक मैनुअल श्रम होता है।

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

नीचे की रेखा सी भाषाओं को समझने में आसान या कारण नहीं है, यही कारण है कि सिस्टम भाषा के रूप में उनका उल्लेख किया जाता है। वे इस उच्च स्तर के अमूर्त बकवास से पहले बाहर आ गए। यह भी है कि फ्रंट एंड वेब प्रोग्रामिंग के लिए उनका उपयोग क्यों नहीं किया जाता है। उनके बस काम के अनुकूल नहीं है, उनका मतलब उन जटिल समस्याओं को हल करना है जिन्हें पारंपरिक भाषा टूलिंग के साथ हल नहीं किया जा सकता है।

यही कारण है कि आपको पागल सामान मिलता है जैसे (माइक्रो-आर्किटेक्चर, ड्राइवर, क्वांटम भौतिकी, एएए गेम्स, ऑपरेटिंग सिस्टम) ऐसी चीजें हैं जो सी और सी ++ केवल अच्छी तरह से अनुकूल हैं। मुख्य क्षेत्र होने की गति और संख्या में कमी।



1

इसके कई कारण हैं, जिनमें शामिल हैं:

  • यह विधानसभा भाषा में संकलित है।
  • यह सांख्यिकीय रूप से टाइप किया गया है।
  • कोई कचरा संग्रह नहीं।
  • कोई त्रुटि से निपटने।
  • कई प्रोग्रामिंग भाषाएं नई सुविधाओं को जोड़ती हैं। C के दर्शन का एक हिस्सा अधिक सुविधाओं को जोड़ने के बजाय चीजों को सरल रखना है।

यह तेज क्यों होना चाहिए क्योंकि यह ऑब्जेक्ट-ओरियंटेड नहीं है?
sb27

ए) ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग कचरा संग्रहण की आवश्यकता पैदा करती है, बी) ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग जैसी बड़ी विशेषताएं कंपाइलर में जटिलता जोड़ देती हैं,
नीलमणिग्रीक

ए) नहीं। C ++ या जंग देखें। बी) हां, लेकिन यह नए अनुकूलन के लिए कंपाइलर के अवसर भी देता है।
sb27

ए) जंग संकलन समय कचरा संग्रहण है, और c ++ कक्षाओं के लिए कचरा संग्रह है, तो इस कारण यह विनाशकर्ता ,, बी) अनुकूलित जटिलता अभी भी जटिलता है
Sapphire_Brick

ए) यह कचरा-संग्रह नहीं है, स्मृति प्रबंधन आपको विधानसभा बी में अपना कार्यक्रम बनाने पर भी करना होगा) नहींं। अधिक अमूर्त आशावादी को बेहतर धारणा बनाने की अनुमति देता है।
sb27
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.