Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रूबी में बेंचमार्किंग अपवाद - हाँ, वे धीमे हैं।

मुझे हमेशा दृढ़ता से संदेह है कि अन्य प्रवाह नियंत्रण तंत्र की तुलना में रूबी में अपवाद धीमे होंगे। आखिरकार - अपवाद एक साधारण "ब्रेक" या "रिटर्न" की तुलना में बहुत अधिक जटिल हैं। लेकिन मैं पहले भी अपने अनुमान में गलत रहा हूं, इसलिए मैंने सोचा कि मैं इसकी परीक्षा ले लूं।

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

require 'benchmark/ips'

def exit_via_exception
  5.times do 
    raise RuntimeError
  end
rescue
end

def exit_via_break
  5.times do 
    break
  end
end

def exit_via_return
  5.times do 
    return
  end
end

Benchmark.ips do |x|
  x.report("exception") {  exit_via_exception }
  x.report("break") {  exit_via_break }
  x.report("return") {  exit_via_return }
end

परिणाम काफी चौकाने वाले हैं। अपवाद का उपयोग करने वाला फ़ंक्शन ब्रेक और रिटर्न का उपयोग करने वालों की तुलना में आधे से भी कम तेज़ है।

$ ruby exception_benchmark.rb
Calculating -------------------------------------
           exception    50.872k i/100ms
               break   125.322k i/100ms
              return   124.173k i/100ms
-------------------------------------------------
           exception    714.795k (± 2.7%) i/s -      3.612M
               break      3.459M (± 3.1%) i/s -     17.294M
              return      3.379M (± 3.0%) i/s -     16.888M

यह सही बेंचमार्क नहीं है

कुछ ऐसे मुद्दे हैं जिनकी भरपाई कैसे की जाए मुझे समझ नहीं आ रहा है। उदाहरण के लिए, अपवाद और विराम विधियों को वापस करना होगा। तो वे उस विधि से अधिक कर रहे हैं जो बस वापस आती है। साथ ही मुझे यह देखने में दिलचस्पी होगी कि अपवाद को बचाने से प्रदर्शन ओवरहेड में जुड़ जाता है या नहीं। लेकिन इसका बचाव नहीं करने से बेंचमार्क निरस्त हो जाता है।

फिर भी, अपवाद अन्य उदाहरणों की तुलना में इतना धीमा है कि मुझे लगता है कि परिणामों का अर्थ है, भले ही वे सही न हों।

हमने जो सबक सीखा?

यदि आप प्रवाह नियंत्रण तंत्र के रूप में अपवादों का उपयोग कर रहे हैं। बस क! खासकर यदि आपके पास एक लूप है जिसमें अपवादों को बार-बार उठाया और पकड़ा जाता है।

क्या यह बदलेगा कि मैं व्यक्तिगत रूप से अपवादों का उपयोग कैसे करता हूं? शायद ऩही। यदि धीमापन नियम का अपवाद है तो मैं थोड़े धीमेपन के साथ जी सकता हूं। :)

...लेकिन JRuby और RBx के बारे में क्या?

जोश चीक (ट्विटर पर @josh_cheek) ने इस बेंचमार्क का अपना संस्करण लिखा है जो मेरे से अधिक व्यापक है। और उन्होंने इसे कई रूबी कार्यान्वयन के खिलाफ चलाया। आप उसका परिणाम यहां देख सकते हैं। जाहिर तौर पर ब्रेक अभी भी विजेता है। :)

  1. Pry . में अपवादों के साथ कार्य करना

    यदि आप मेरे जैसे हैं, तो आप रेल कंसोल का बहुत उपयोग करते हैं। और अब तक मुझे लगता है कि हर कोई इस बात से सहमत है कि रेल कंसोल के लिए Pry सबसे अच्छी चीज है ... ठीक है, कभी भी। बिल्ट-इन टू प्राइ कुछ बहुत ही शानदार विशेषताएं हैं जो साधारण पुराने IRB की तुलना में अपवादों के साथ काम करना बहुत आसान बनाती

  1. रूबी में कस्टम अपवाद

    रूबी में अपने स्वयं के अपवाद बनाना आसान है। बस इन चरणों का पालन करें: 1. एक नई कक्षा बनाएं अपवाद वर्ग हैं, जैसे रूबी में बाकी सब कुछ! एक नए प्रकार का अपवाद बनाने के लिए, बस एक ऐसा वर्ग बनाएं जो StandardError या उसके किसी बच्चे से विरासत में मिला हो। class MyError < StandardError end raise MyErr

  1. रूबी में अपवादों में संदर्भ डेटा कैसे जोड़ें

    कभी-कभी मानक बैकट्रैक/त्रुटि संदेश कॉम्बो पर्याप्त नहीं होता है। त्रुटि के कारण का पता लगाने के लिए कभी-कभी आपको अतिरिक्त डेटा की आवश्यकता होती है। सौभाग्य से, रूबी में करना बहुत आसान है। त्रुटि संदेश को अनुकूलित करना अपनी त्रुटियों में प्रासंगिक जानकारी जोड़ने का सबसे आसान तरीका इसे अपवाद के संदेश