the - what is c++ in english




डायनामिक_कास्ट का प्रदर्शन? (3)

प्रश्न पढ़ने से पहले:
यह सवाल dynamic_cast का उपयोग करने के लिए कितना उपयोगी है, इस बारे में नहीं है। बस इसके प्रदर्शन के बारे में।

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

मैंने केवल उन पर विश्वास करने के बजाय इस पद्धति के प्रदर्शन का परीक्षण करने का निर्णय लिया।

निम्नलिखित कोड का उपयोग किया गया था:

ptime firstValue( microsec_clock::local_time() );

ChildObject* castedObject = dynamic_cast<ChildObject*>(parentObject);

ptime secondValue( microsec_clock::local_time() );
time_duration diff = secondValue - firstValue;
std::cout << "Cast1 lasts:\t" << diff.fractional_seconds() << " microsec" << std::endl;

उपरोक्त कोड उपयोग करने के तरीकों का उपयोग करता है boost::date_time लिनक्स पर उपयोग करने योग्य मान प्राप्त करने के लिए।
मैंने एक निष्पादन में 3 dynamic_cast किया है, उन्हें मापने के लिए कोड समान है।

1 निष्पादन के परिणाम निम्नलिखित थे:
Cast1 रहता है: 74 microsec
Cast2 रहता है: 2 microsec
Cast3 रहता है: 1 microsec

पहले कलाकारों ने हमेशा 74-111 microsec लिया, उसी निष्पादन में निम्नलिखित कलाकारों ने 1-3 microsec लिया।

तो आखिरकार मेरे सवाल:
क्या वाकई dynamic_cast बुरा प्रदर्शन कर रहा है?
वृषण के अनुसार इसके नहीं। क्या मेरा टेस्टकोड सही है?
इतना डेवलपर्स क्यों सोचते हैं कि अगर यह नहीं है तो यह धीमा है?


यह कहने के लिए क्षमा करें, लेकिन आपका परीक्षण यह निर्धारित करने के लिए लगभग बेकार है कि कलाकार धीमा है या नहीं। माइक्रोसेकंड का रिज़ॉल्यूशन कहीं भी अच्छा नहीं है। हम एक ऑपरेशन के बारे में बात कर रहे हैं, यहां तक ​​कि सबसे खराब स्थिति में, एक विशिष्ट पीसी पर 100 घड़ी टिक, या 50 नैनोसेकंड से कम नहीं कहना चाहिए।

इसमें कोई संदेह नहीं है कि डायनेमिक कास्ट एक स्टैटिक कास्ट या रीइंटरप्रिटेड कास्ट की तुलना में धीमी होगी, क्योंकि असेंबली लेवल पर, बाद के दोनों एक असाइनमेंट (वास्तव में तेज, 1 क्लॉक टिक का ऑर्डर) की राशि होगी और डायनेमिक कास्ट की आवश्यकता होती है कोड को उसके वास्तविक प्रकार को निर्धारित करने के लिए जाने और निरीक्षण करने के लिए कोड।

मैं यह नहीं कह सकता कि यह वास्तव में कितना धीमा है, यह संभवतः संकलक से संकलक तक भिन्न होगा, मुझे कोड की उस पंक्ति के लिए उत्पन्न असेंबली कोड को देखना होगा। लेकिन, जैसा मैंने कहा, प्रति कॉल 50 नैनोसेकंड उचित होने की उम्मीद की ऊपरी सीमा है।


यहाँ कुछ मानक दिए गए हैं:
http://tinodidriksen.com/2010/04/14/cpp-dynamic-cast-performance/
http://www.nerdblog.com/2006/12/how-slow-is-dynamiccast.html

उनके अनुसार, डायनेमिक_कास्ट पुनर्संरचना_कास्ट की तुलना में 5-30 गुना धीमा है, और सबसे अच्छा वैकल्पिक रीइंटरस्टार्ट_कास्ट के रूप में लगभग एक ही प्रदर्शन करता है।

मैं पहले लेख से निष्कर्ष उद्धृत करूँगा:

  • डायनेमिक_कास्ट कुछ के लिए धीमा है, लेकिन बेस प्रकार के लिए कास्टिंग; उस विशेष कास्ट को अनुकूलित किया गया है
  • वंशानुक्रम स्तर का डायनेमिक_कास्ट पर बड़ा प्रभाव पड़ता है
  • सदस्य चर + reinterpret_cast सबसे तेजी से विश्वसनीय तरीका है
    निर्धारित प्रकार; हालाँकि, इसका रखरखाव बहुत अधिक है
    जब कोडिंग

पूर्ण संख्या एकल कलाकारों के लिए 100 ns के क्रम पर होती है। 74 मिसे जैसे मूल्य वास्तविकता के करीब नहीं लगते हैं।


समतुल्य कार्यक्षमता की तुलना के बिना प्रदर्शन निरर्थक है। अधिकांश लोग कहते हैं कि समतुल्य व्यवहार की तुलना किए बिना डायनेमिक_कास्ट धीमा है। इस पर उन्हें बाहर बुलाओ। दूसरे तरीके से रखो:

यदि 'कार्य' कोई आवश्यकता नहीं है, तो मैं कोड लिख सकता हूं जो कि आपकी तुलना में तेजी से विफल होता है।

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

हालाँकि, डायनामिक_कास्ट का उपयोग नहीं करना हमेशा इसका उपयोग करने की तुलना में तेज़ होगा - लेकिन अगर आपको वास्तव में डायनेमिक_कास्ट की आवश्यकता नहीं है, तो इसका उपयोग न करें! यदि आपको डायनेमिक लुकअप की आवश्यकता है, तो कुछ ओवरहेड होंगे, और फिर आप विभिन्न रणनीतियों की तुलना कर सकते हैं।





boost-date-time