আমি সবসময় দৃঢ়ভাবে সন্দেহ করতাম যে এক্সেপশন রুবিতে অন্যান্য ফ্লো কন্ট্রোল মেকানিজমের চেয়ে স্লো হবে।.aws এক্সেপশন একটি সিম্পল "break" বা "return"-এর চেয়ে অনেক বেশি জটিল। কিন্তু আমি আগেও আমার অনুমানে ভুল হয়েছি, তাই আমি চিন্তা করলাম इसे টেস্ট করে দেখি।
নিচের কোডে আমি benchmark-ips জেম ব্যবহার করছি লুপ থেকে এক্সিট করারrelative পারফরম্যান্স তুলনা করতে: এক্সেপশন, ব্রেক এবং রিটার্ন দিয়ে। আমি webs路上 এমন বেঞ্চমার্কের উদাহরণ দেখেছি 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 (@josh_cheek on twitter) এই বেঞ্চমার্কের নিজের ভার্সন লিখেছেন যা আমার চেয়ে বেশি কম্প্রিহেনসিভ। এবং সেটি মাল্টিপল রুবি ইমপ্লিমেন্টেশনের ওপর রান করিয়েছেন। আপনি তার রেজাল্ট এখানে দেখতে পারেন। একইভাবে ব্রেকই জিতেছে। :)