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

प्रदर्शन तुलना: Ruby में अपवाद बनाम ब्रेक और रिटर्न

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

नीचे दिए गए कोड में मैं लूप से बाहर निकलने के लिए अपवाद, ब्रेक और रिटर्न के सापेक्ष प्रदर्शन की तुलना करने के लिए benchmark-ips जेम का उपयोग कर रहा हूँ। मैंने वेब पर ऐसे बेंचमार्क के उदाहरण MRI 1.9 के साथ देखे हैं। लेकिन मैं इसे MRI 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 ट्विटर पर) ने इस बेंचमार्क का अपना संस्करण लिखा जो मेरे से अधिक व्यापक है। और उसने इसे कई Ruby इम्प्लीमेंटेशन के खिलाफ चलाया। आप उसके परिणाम यहां देख सकते हैं। जाहिर तौर पर ब्रेक अभी भी विजेता है। :)


  1. Pry में अपवाद हैंडलिंग में महारत हासिल करें: Rails कंसोल के लिए उन्नत तकनीकें Pry में अपवाद हैंडलिंग में महारत हासिल करें: Rails कंसोल के लिए उन्नत तकनीकें

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

  1. Ruby में कस्टम अपवाद में महारत हासिल करें: एक चरण-दर-चरण गाइड Ruby में कस्टम अपवाद में महारत हासिल करें: एक चरण-दर-चरण गाइड

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

  1. रूबी एक्सेप्शन को प्रासंगिक डेटा के साथ बढ़ाएं – एक व्यावहारिक गाइड रूबी एक्सेप्शन को प्रासंगिक डेटा के साथ बढ़ाएं – एक व्यावहारिक गाइड

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