2011-06-29 7 views
5

_Unwind_SjLj_Unregister और _Unwind_SjLj_Register क्या हैं? मैं उन्हें अपने जीआरओफ़ रिपोर्ट में अपने शीर्ष प्रोसेसर समय उपयोगकर्ताओं के रूप में प्राप्त करता हूं। Google केवल इन दोनों के साथ त्रुटियों की शिकायत करने वाले लोगों के लिंक देता है।_Unwind_SjLj_Unregister और _Unwind_SjLj_Register क्या हैं?

heres मेरी रिपोर्ट है कि बार का ही हिस्सा

= 0:

Flat profile: 

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total   
time seconds seconds calls ms/call ms/call name  
33.33  0.03  0.03        _Unwind_SjLj_Unregister 
22.22  0.05  0.02        _Unwind_SjLj_Register 
11.11  0.06  0.01 13886  0.00  0.00 toint(std::string, int) 
11.11  0.07  0.01  4380  0.00  0.00 hexlify(std::string) 
11.11  0.08  0.01  2994  0.00  0.00 std::_Deque_iterator<unsigned char, unsigned char const&, unsigned char const*>::operator+(int) const 
11.11  0.09  0.01        std::string::assign(char const*, unsigned int) 

im चल विंडोज 7 x64, और codeblocks साथ संकलन 10.05 जीसीसी

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

के बाद प्रोग्राम को 64 सेकंड चलाने के लिए मजबूर करने वाले कार्यों को सक्षम करना, अब यह दिखता है:

Flat profile: 

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total   
time seconds seconds calls s/call s/call name  
    8.45  3.49  3.49        _Unwind_SjLj_Register 
    7.36  6.53  3.04 4000006  0.00  0.00 CAST128::setkey(std::string) 
    5.86  8.95  2.42        _Unwind_SjLj_Unregister 
    4.36  10.75  1.80 64000080  0.00  0.00 CAST128::F(int&, unsigned int&, unsigned int&, unsigned char&) 
    3.68  12.27  1.52        __dynamic_cast 
    3.37  13.66  1.39        std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) 
    3.25  15.00  1.34        std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() 
    2.88  16.19  1.19        std::istreambuf_iterator<char, std::char_traits<char> > std::num_get<char, std::istreambuf_iterator<char, std::char_traits<char> > >::_M_extract_int<unsigned long long>(std::istreambuf_iterator<char, std::char_traits<char> >, std::istreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, std::_Ios_Iostate&, unsigned long long&) const 

उत्तर

4

मेरा मानना ​​है कि यह अपवाद हैंडलिंग है। जब लोग एक अलग संकलक में निर्मित सी ++ लाइब्रेरी से लिंक करने का प्रयास करते हैं तो ज्यादातर समस्याएं आती हैं।

+0

क्या यह एक अच्छी बात है या बुरी बात यह है कि यह शीर्ष पर है? मुझे कोई समस्या नहीं आ रही है (मुझे लगता है)। इसकी रिपोर्ट – calccrypto

+2

हम्म में है। यह आश्चर्य की बात है कि आपका प्रोग्राम अपवाद हैंडलर पर 55% समय का उपयोग कर रहा है। लेकिन आइए कुछ और तर्कसंगत सोचें: मुझे लगता है कि आपकी प्रोफ़ाइल ने उन लोगों के लिए सटीक 0.03 सेकंड और 0.02 सेकंड मापा है। और बाकी सब कुछ के लिए 0.01 सेकंड। ऐसा लगता है कि कार्यक्रम को चलाने के लिए लगभग कोई समय नहीं लगा, और प्रोफाइलर 0.01 सेकंड ग्रैन्युलरिटी से कम में कुछ भी मापने में असमर्थ है। किसी भी सार्थक जानकारी प्राप्त करने के लिए आपको बहुत अधिक समय की आवश्यकता है। आप मूल रूप से रेत के छह अनाज देख रहे हैं, दूसरों की तुलना में थोड़ा बड़ा, और समुद्र तट को साफ करने का तरीका जानने का प्रयास कर रहे हैं। – mgiuca

+0

लॉल। मेरे प्रोग्राम को चलाने के लिए लगभग 2 सेकंड लगते हैं। जो इसे – calccrypto

1

पहला: शायद इस तरह के प्रश्नों के लिए आपके कंपाइलर और मंच का उल्लेख करना उचित होगा।

अब: कुछ प्लेटफॉर्म/कुछ कॉन्फ़िगरेशन/कुछ कंपाइलर्स पर, सी ++ में अपवाद हैंडलिंग "setjmp" और "longjmp" फ़ंक्शंस (मानक सी लाइब्रेरी का हिस्सा) का उपयोग करके लागू किया गया है। _Unwind_SjLj_ [Un] पंजीकरण विधियों को इसके साथ करना है। काफी बोलते हुए, जब कोशिश करें .. कैच ब्लॉक दर्ज किया जाता है, एक हैंडलर को पंजीकृत करने की आवश्यकता होती है, और जब ब्लॉक छोड़ा जाता है, तो हैंडलर को अनियंत्रित करने की आवश्यकता होती है।

3

मैं यहां सबसे अच्छा जवाब नहीं दे सकता, लेकिन मुझे पता है कि एसजेएलजे setjmp और longjmp को संदर्भित करता है। इन्हें आमतौर पर अपवाद हैंडलिंग के लिए उपयोग किया जाता है। मुझे लगता है कि को संकलक द्वारा आंतरिक रूप से उपयोग किया जाएगा जब आप try कथन (एसजेएलजे अपवाद हैंडलर "रजिस्टर" करने के लिए) दर्ज करते हैं और का उपयोग तब किया जाएगा जब आप try कथन से बाहर निकलेंगे। हालांकि अनुमान लगाने का क्रमबद्ध करें।

+0

मुझे विश्वास नहीं है कि मेरे पास मेरे कार्यक्रम में कोई प्रयास नहीं है। ** संपादित करें ** नहीं। मैंने जाँचा। यह कुछ एसएलएल लाइब्रेरी में छिपाया जा सकता है – calccrypto

+0

हो सकता है कि आप जिस लाइब्रेरी को कॉल कर रहे हैं उसमें ट्रॉइस हो। – mgiuca

+0

लेकिन आप सी ++ मानक पुस्तकालय का उपयोग कर रहे हैं, और इसमें 'कोशिश करें' है। – davmac

0

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

तो यदि आपके प्रोग्राम में संभावित अपवाद भी अधिकतर std :: bad_alloc हैं, और आप आवंटन या आपके आंतरिक लूप से आवंटन की संभावना को स्थानांतरित कर सकते हैं, तो जीसीसी को सफाई के बाद निपटने की आवश्यकता नहीं होगी आपके भीतर लूप के अंदर संभावित std :: bad_alloc अपवाद। चीजों को गति देना चाहिए। इस बात पर विचार करना याद रखें कि वेक्टर :: push_back जैसी चीजें स्मृति आवंटित कर सकती हैं। यहां तक ​​कि यदि आप पुनर्विक्रय को रद्द करने के लिए वेक्टर :: रिजर्व को पहले कॉल करते हैं, तो जीसीसी शायद यह समझने के लिए पर्याप्त स्मार्ट न हो कि पुनर्वितरण होने वाला नहीं है।

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

0

यह एक बिल्कुल विशिष्ट मामला है, लेकिन मुझे आर में आरसीपीपी पैकेज का उपयोग करके इस त्रुटि का सामना करना पड़ा। -std = C++ 11 ध्वज ने समस्या का कारण बनता है, और चीजें ठीक-ठीक = सी ++ के साथ ठीक काम करती हैं 0x।

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