2013-05-25 5 views
6

मैं ऑफ-जाली प्रसार सीमित एकत्रीकरण (डीएलए) सिमुलेशन लिखने वाला हूं और मैं सोच रहा हूं कि सी या सी ++ का उपयोग करना है या नहीं।सी बनाम सी ++ संख्यात्मक सिमुलेशन (प्रदर्शन)

सी ++ डिजाइन कारणों से अच्छा होगा लेकिन मुझे आश्चर्य है कि सी बेहतर प्रदर्शन करेगा या नहीं। बेशक मैं एल्गोरिदम प्रदर्शन के बारे में जानता हूं और सर्वोत्तम संभव एल्गोरिदम चुना है। इसलिए मैं ओ (एन^2) से ओ (लॉग एन) या इसी तरह के सुधार के बारे में बात नहीं कर रहा हूं। मैं बोलने के लिए अपने स्थिरांक को कम करने की कोशिश कर रहा हूं।

यदि आपको डीएलए नहीं पता है तो यह मूल रूप से युगल (10^3 और 10^6 के बीच आकार) के लिए उबाल जाता है और एक लूप में यादृच्छिक युगल चुनने के लिए (अधिक/कम) तुलना करने के लिए बड़े भाग सरणी

  • डेटा एक्सेस: सार्वजनिक डेटा सदस्यों के मुकाबले निजी डेटा के सदस्यों और accessors साथ सी ++ वर्ग के साथ सी struct बनाम सी ++ वर्ग

    तो प्रदर्शन अंतर जो इस के लिए कोई फर्क होगा डेटा का उपयोग और बुला कार्यों है।

  • कॉलिंग फ़ंक्शंस: सी फ़ंक्शंस बनाम सी ++ सदस्य फ़ंक्शन।

क्या मुझे यह निष्कर्ष निकालने का अधिकार है कि इसका न्याय करने का अंतिम तरीका असेंबली कोड (उदाहरण के लिए चाल/भार, कूद और कॉल की संख्या की तुलना करना) को देखना है? यह निश्चित रूप से संकलक निर्भर है (उदाहरण के लिए आप एक भयानक सी संकलक की तुलना एक अच्छे सी ++ कंपाइलर से कर सकते हैं)। मैं जीएनयू कंपाइलर्स (जीसीसी और जी ++) का उपयोग कर रहा हूं।

सी कार्यक्रम

:

मैं पाया है कि विधानसभा जीसीसी और जी ++ द्वारा पैदा करता छलांग (कोई नहीं), चलता रहता है/भार और कॉल दो निम्नलिखित कार्यक्रमों के लिए की संख्या के मामले में लगभग समान है

#include <stdlib.h> 

typedef struct 
{ 
    double x; 
} particle; 

double square(double a) 
{ 
    return a*a; 
} 

int main() 
{ 

    particle* particles = malloc(10*sizeof(particle)); 
    double res; 

    particles[0].x = 60.42; 

    res = square(particles[0].x); 

    return 0; 
} 

सी ++ प्रोग्राम

class particle 
{ 
    public: 
     double x; 

    public: 
     double square() 
     { 
      return x*x; 
     } 

}; 

int main() 
{ 

    particle* particles = new particle[10]; 
    double res; 

    particles[0].x = 60.42; 

    res = particles[0].square(); 

    return 0; 
} 

अगर मैं निजी मुझे इस्तेमाल सी ++ प्रोग्राम में एमबर डेटा मैं कणों [0] .setx (60.42) को कॉल करते समय निश्चित रूप से असेंबली में एक और कॉल प्राप्त करता हूं।

क्या इसका मतलब यह है कि मैं सी ++ को सी के रूप में भी चुन सकता हूं क्योंकि वे लगभग उसी असेंबली कोड का उत्पादन करते हैं? क्या मुझे निजी सदस्य डेटा से बचना चाहिए क्योंकि यह अतिरिक्त फ़ंक्शन कॉल जोड़ता है (उदा। असेंबली में कॉल किया जाता है)?

+1

सी ++ सी के मुकाबले ज्यादा प्रदर्शन कर सकता है और आप सी ++ को कैसे कॉल कर रहे हैं? मुझे आश्चर्य है कि यह 'स्क्वायर()' विधि को इनलाइन नहीं करता है अगर वे – Collin

+0

पर हैं, तो कोई बिंदु 'सेटएक्स' विधि नहीं बनाते हैं, यदि केवल एक चीज जो आपके द्वारा पारित की गई है, तो x को सेट कर सकती है डेटा सार्वजनिक। सी ++ का उपयोग करने का मतलब यह नहीं है कि आप केवल सदस्यों के साथ structs का उपयोग नहीं कर सकते हैं। –

+0

यदि आपका एल्गोरिदम संख्याओं के बड़े सरणी के आधार पर है, तो हो सकता है कि आप स्मृति चर के साथ कक्षाओं का उपयोग करना चाहें क्योंकि आपके उदाहरण में स्मृति में कक्षा को कैसे रखा जाता है। आप मिश्रित सदस्य डेटा वाले कक्षाओं के निरंतर आवंटन के बजाय युगल के बड़े निरंतर आवंटन के साथ बेहतर प्रदर्शन देख सकते हैं। – PureW

उत्तर

8

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

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

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

+0

'टेम्पलेट मेटाप्रोग्रामिंग' के बारे में नहीं पता था। इसके लिए धन्यवाद। –

+0

आप सही हैं, मैंने जीएनयू कंपाइलर को पास किए गए किसी ऑप्टिमाइज़ेशन झंडे के बिना यह परीक्षण किया था। ओ 2 और ओ 3 असेंबली पढ़ने के लिए लगभग असंभव है। – Wuhtzu

+0

@Wuhtzu: हाँ - अनुकूलन के साथ चालू, परिणाम सुंदर बालों वाली हो सकती है। * आमतौर पर * हालांकि तेज तेज। –

1

आपके द्वारा पोस्ट किए गए मामले में, आप मूल रूप से malloc और new के बीच प्रदर्शन अंतर पूछ रहे हैं।

सी ++ में new ऑपरेटर अतिरिक्त कार्यक्षमता करता है, जैसे ऑब्जेक्ट के कन्स्ट्रक्टर को कॉल करना या चर प्रारंभ करना।

सी में समकक्ष संचालन के लिए, आपको malloc पर कॉल करने के बाद चर प्रारंभ करना होगा। सी ++ और फिर प्रोफाइल की तरह व्यवहार करने के लिए अपने सी प्रोग्राम को बदलें।

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

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

कई प्रदर्शन मुद्दे भाषा पर नहीं बल्कि डिजाइन और प्लेटफ़ॉर्म पर निर्भर करते हैं। कैश मिस, लूप अनोलिंग, कई तुलना, भाषा के बावजूद प्रदर्शन को प्रभावित कर सकते हैं।

+0

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

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