আমি সবসময় দৃঢ়ভাবে সন্দেহ করেছি যে রুবিতে অন্যান্য প্রবাহ নিয়ন্ত্রণ প্রক্রিয়ার তুলনায় ব্যতিক্রমগুলি ধীর হবে। সর্বোপরি - ব্যতিক্রমগুলি একটি সাধারণ "ব্রেক" বা "রিটার্ন" এর চেয়ে অনেক বেশি জটিল। কিন্তু আমি আগেও আমার অনুমানে ভুল করেছি, তাই আমি ভেবেছিলাম আমি এটা পরীক্ষা করব।
নীচের কোডে আমি ব্যতিক্রম, বিরতি এবং প্রত্যাবর্তনের মাধ্যমে লুপ থেকে প্রস্থান করার আপেক্ষিক কর্মক্ষমতা তুলনা করতে বেঞ্চমার্ক-আইপিএস রত্ন ব্যবহার করছি। আমি ওয়েবে এমআরআই 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 (@josh_cheek টুইটারে) এই বেঞ্চমার্কের তার নিজস্ব সংস্করণ লিখেছেন যা আমার চেয়ে আরও ব্যাপক। এবং তিনি একাধিক রুবি বাস্তবায়নের বিরুদ্ধে এটি চালান। আপনি এখানে তার ফলাফল দেখতে পারেন. দৃশ্যত বিরতি এখনও বিজয়ী. :)