मेरा हमेशा से दृढ़ता से संदेह रहा है कि अपवाद 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 इम्प्लीमेंटेशन के खिलाफ चलाया। आप उसके परिणाम यहां देख सकते हैं। जाहिर तौर पर ब्रेक अभी भी विजेता है। :)