6

इस बारे में एक समान सवाल पूछा गया था लेकिन यह बिल्कुल उसी शर्तों में नहीं पूछा गया था।एरलांग 'पकड़' अभिव्यक्ति बनाम दक्षता के मामले में कोशिश/पकड़

मैं बेस 64 बाइनरी को सुरक्षित रूप से डीकोड करने की कोशिश कर रहा हूं, एक संदर्भ में जहां यह संभव है कि इनपुट बाइनरी या बेस 64 एन्कोडेड न हो।

एरलांग कहते हैं कि इसे दुर्घटनाग्रस्त होने दें और इसे संभालें - अगर मैं ऐसा करना चाहता हूं, तो सबसे प्रभावी तरीका क्या है। इस प्रणाली में दक्षता काफी महत्वपूर्ण है।

मुझे कोशिश/पकड़ने से बचने के लिए पता है, क्योंकि यह एक पूर्ण स्टैक ट्रेस बनाता है - हालांकि, इस संदर्भ के लिए कैच कीवर्ड उचित है? और पकड़ कीवर्ड तेजी से/अधिक कुशल है?

एक समारोह में इस तरह के रूप में

safe_decode(Binary) -> 
    case catch base64:decode(Binary) of 
     <<Result/binary>> -> {ok, Result}; 
     {'EXIT', _} -> {not_base64, Binary} 
    end. 

इस सही मायने में अधिक एक कोशिश पकड़ से कुशल है? इस परिदृश्य को उस प्रणाली में कैसे संभालना सबसे अच्छा है जहां दक्षता महत्वपूर्ण है यानी दुर्घटनाएं जिसमें एक स्टैक ट्रेस बनाने और/या खुश पथ की तुलना में अधिक प्रसंस्करण की आवश्यकता होती है, जितनी संभव हो सके कुशलतापूर्वक संभालने की आवश्यकता होती है।

मैं सिर्फ एरलांग सीख रहा हूं, तो शायद जवाब मुझे चेहरे पर देख रहा है।

उत्तर

9

नहीं, यह दूसरी तरफ है: catch से बचें क्योंकि यह हमेशा एक स्टैक ट्रेस बनाता है। try + catch यदि आप इसे erlang:get_stacktrace() से पूछते हैं तो केवल एक स्टैक ट्रेस बनाता है।

Heads-up: The cost of get_stacktrace() देखें, पूरी कहानी के लिए 2013-11-05 पर रिचर्ड कार्ल्सन द्वारा दिए गए प्रश्नों के लिए पोस्ट किया गया।

: मुझे कुछ भागों का हवाला देते हैं (कार्यकारी सारांश: अपवाद सस्ता है, लेकिन erlang: get_stacktrace() महंगा की तरह , यह भी, 'पकड़ Expr' से बचें।)

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

अंत में, यह भी एक और कारण में 'पकड़ Expr' की पुरानी घटनाओं के पुनर्लेखन के लिए है 'Expr पकड़ की कोशिश ... अंत' [...]

+0

बहुत दिलचस्प - धन्यवाद! –

+2

आप एक दर्दनाक रूप से दुर्घटनाग्रस्त प्रक्रिया को 'spawn_monitor' भी करना चाहेंगे जो आपको किसी भी' try..catch' पागलपन को प्रोत्साहित किए बिना सीधे विफलता पर एक सफलता या मृत्यु नोट (मॉनीटर) का संदेश भेज देगा। * कभी-कभी * यह आदर्श समाधान है। कभी नहीं। हमेशा के रूप में, बेंचमार्क। यदि आप खराब इनपुट डेटा के * बहुत * को पकड़ रहे हैं तो क्रैश हल्का भार हो सकता है। यदि आपका 99% इनपुट डेटा अच्छा है, तो 'try..catch' शायद बेहतर है। – zxq9

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