2012-12-14 16 views
7

ठीक है, यहाँ मैं यही चाहता हूँ:कक्षा के तरीके वीएस कक्षा स्थिर कार्य वीएस सरल कार्यों - प्रदर्शन के अनुसार?

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

और अब, मैं निम्न परिदृश्यों पर विचार कर रहा हूँ:

  • उन्हें के रूप में सरल कार्यों बनाएँ और बस तर्क के रूप में आवश्यक पैरामीटर भेजने
  • ('समूह' के लिए एक कक्षा बनाएं/संगठन उद्देश्यों) और बस उन्हें स्थिर
  • प्रकार के अनुसार वर्ग बनाएं, उदाहरण के लिए बिटमैप्स पर काम करने के लिए एक कक्षा बनाएं, (हर बिटमैप के लिए कि कक्षा का एक नया उदाहरण बनाने Bitmap* myBitmap = newBitmap(1010); जैसे, और उसके भीतरी तरीकों (जैसे myBitmap->getFirstBitSet())

अब, इन तरीकों में से जो सबसे तेज है के साथ इस पर काम करते हैं? ? वहाँ वास्तव में सीधे सरल कार्य करता है और कक्षा-समझाया static काम करता है, प्रदर्शन के लिहाज से किसी भी अन्य परिदृश्य है कि बेहतर होगा, जो मैं उल्लेख नहीं किया है के बीच कोई अंतर है


Sidenote:? मैं उपयोग कर रहा हूँ मैक ओएस एक्स 10 के लिए clang++ कंपाइलर। 6.8। (यदि इससे कोई फर्क पड़ता है)

+0

प्रोफाइलिंग का प्रयास किया? –

+1

यदि आप प्रदर्शन के बारे में वास्तव में चिंतित हैं, तो आपको अपने envrionment पर प्रस्तावित दोनों संस्करणों को प्रोफ़ाइल करना चाहिए। इस तरह आपको मेरे अनुमानों के बजाय एक अच्छा निदान मिलता है, जो यहां दिए गए उत्तरों आपको प्रदान करेंगे। –

+0

@ लुचियानग्रिगोर + अलोकसेव ईमानदार होने के लिए, नहीं, मैंने कोई प्रोफाइलिंग परीक्षा नहीं चलाई है। हां, मुझे पता है कि कुछ चीजों को सटीक वातावरण के आधार पर निदान किया जाना बेहतर है, जिन पर वे चल रहे हैं; मुझे लगता है कि मुझे अपनी दुविधा के पीछे सिद्धांत के कुछ बिट्स पर कुछ राय चाहिए, मुझे याद आ रही है। * (उदाहरण के लिए, हालांकि मैंने इसे माना है, क्या एक वर्ग निर्माण और विधि कॉल एक साधारण फ़ंक्शन कॉल से तेज़ हो सकता है? फिर भी अनुमान लगा रहा है ... हालांकि मुझे लगता है कि मैं सही अनुमान लगा रहा हूं ...) * –

उत्तर

14

सीपीयू स्तर पर, केवल one kind of function है, और यह बहुत सी प्रकार जैसा दिखता है। आप अपना खुद का शिल्प तैयार कर सकते हैं, लेकिन ...

यह पता चला है के रूप में, सी ++ मन में दक्षता के साथ बनाया जा रहा कॉल करने के लिए सीधे अधिकांश कार्यों को नक्शे निर्देश:

  • एक namespace स्तर समारोह एक नियमित रूप से सी समारोह
  • एक स्थिर विधि की तरह है की तरह है एक नामस्थान स्तर फ़ंक्शन (कॉल के बिंदु बिंदु से)
  • एक गैर-स्थैतिक विधि एक स्थिर विधि के समान ही है, एक अंतर्निहित this पैरामीटर को अन्य पैरामीटर (एक पॉइंटर)
  • के शीर्ष पर पारित किया गया है

उन सभी 3 में एक ही तरह का प्रदर्शन है।

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

+0

बहुत बहुत धन्यवाद! ;-) –

3

क्लासिक पुराने सी कार्यों और कक्षाओं के स्थैतिक तरीकों के बीच बिल्कुल कोई अंतर नहीं है। अंतर केवल सौंदर्य है। यदि आपके पास एकाधिक सी फ़ंक्शन हैं जिनमें उनके बीच कुछ संबंध हैं, तो आप:

  • उन्हें कक्षा में समूहित कर सकते हैं;
  • उन्हें एक नामस्थान में रखें;

अंतर फिर से सौंदर्य होगा। सबसे अधिक संभावना यह पठनीयता में सुधार होगा।

मैं आपको डमी इंस्टेंस बनाने से हतोत्साहित करता हूं। यह स्रोत कोड के पाठक को भ्रामक होगा।

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

+0

बहुत बहुत धन्यवाद, दोस्त! ;-) –