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