2012-01-10 14 views
6
कोशिश ++

संभव डुप्लिकेट:
Measuring exception handling overhead in C++
Performance when exceptions are not thrown (C++)सी के रन-टाइम दंड ब्लॉक

मैं anecdotally सुना है कि का उपयोग कर "कोशिश" सी में ब्लॉक ++ रन पर कोड धीमा कभी भी अगर कोई अपवाद नहीं होता है। मैंने खोज की है लेकिन इसके लिए कोई स्पष्टीकरण या पर्याप्तता नहीं मिली है। क्या किसी को पता है कि यह सच है & यदि ऐसा है तो क्यों?

+1

मुझे यह लगता है: http://stackoverflow.com/questions/691168/how-much-footprint-does-c-exception-handling-add आपके प्रश्न का उत्तर देगा। –

+1

इस प्रश्न पर एक नज़र डालें: http://stackoverflow.com/questions/43253/measuring-exception-handling-overhead-in-c – codeling

+3

¤ सी ++ मानकीकरण समिति की [सी ++ प्रदर्शन पर तकनीकी रिपोर्ट (आईएसओ/आईईसी टीआर 18015 : 2006 सी ++ प्रदर्शन - ड्राफ्ट टीआर)] (http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf)। अनिवार्य रूप से, यह अपवाद हैंडलिंग लागू करने के तरीके पर निर्भर करता है, जो बदले में अक्सर क्या होगा इसके बारे में धारणाओं पर निर्भर करता है। चीयर्स और एचटी।, –

उत्तर

17

उत्तर, आमतौर पर, "यह निर्भर करता है" है।

यह इस बात पर निर्भर करता है कि आपके कंपाइलर द्वारा अपवाद हैंडलिंग कैसे लागू की जाती है।

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

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

+1

लेकिन कोशिश/पकड़ डालने से किसी भी (सही) अनुकूलन कंपाइलर में ऑप्टिमाइज़ेशन (डिग्री) तक अक्षम हो जाएगा। –

+0

हू? आप किस अनुकूलन का मतलब है, और क्यों? – jalf

+1

आप इसे नाम दें - लूप ऑप्टिमाइज़ेशन (यदि कोशिश/पकड़ लूप में है), सामान्य उप-संपीड़न उन्मूलन आदि।कंपाइलर को यह मानना ​​चाहिए कि कोड किसी भी बिंदु से कैच ब्लॉक में किसी भी बिंदु से कूद सकता है, इसलिए यह कोशिश सीमा सीमा पार आसानी से अनुकूलित नहीं हो सकता है। –

6

अपवादों को लागू करने के दो सामान्य तरीके हैं।

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

दूसरा, जिसे कभी-कभी "स्टैक-आधारित", "setjmp-longjmp" या "sjlj" के रूप में जाना जाता है, वर्तमान कॉल स्टैक को खोलने के तरीके को निर्दिष्ट करने के लिए गतिशील डेटा को बनाए रखता है। जब भी आप try ब्लॉक दर्ज करते हैं या छोड़ते हैं, और जब भी आप एक गैर-तुच्छ विनाशक के साथ स्वचालित ऑब्जेक्ट बनाते या नष्ट करते हैं, तो इसमें कुछ रनटाइम ओवरहेड होता है।

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

+0

'DWARF' का उपयोग केवल डीबगिंग जानकारी AFAIK के लिए किया जाता है, कभी भी डेटा को अनदेखा करने के लिए कभी नहीं – Hasturkun

+1

@ हस्तार्कुन: स्टैक को खोलने के लिए आवश्यक जानकारी डीबगिंग के लिए आवश्यक जानकारी (कुछ) के समान है, इसलिए कम से कम जीसीसी और एलएलवीएम डीडब्ल्यूएआरएफ का उपयोग करें दोनों, और कभी-कभी तालिका-आधारित हैंडलिंग को "डीडब्ल्यूएआरएफ हैंडलिंग" के रूप में संदर्भित करते हैं। –

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