কম্পিউটার

রুবিতে বেঞ্চমার্কিং ব্যতিক্রম - হ্যাঁ, তারা ধীর।

আমি সবসময় দৃঢ়ভাবে সন্দেহ করেছি যে রুবিতে অন্যান্য প্রবাহ নিয়ন্ত্রণ প্রক্রিয়ার তুলনায় ব্যতিক্রমগুলি ধীর হবে। সর্বোপরি - ব্যতিক্রমগুলি একটি সাধারণ "ব্রেক" বা "রিটার্ন" এর চেয়ে অনেক বেশি জটিল। কিন্তু আমি আগেও আমার অনুমানে ভুল করেছি, তাই আমি ভেবেছিলাম আমি এটা পরীক্ষা করব।

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


  1. কিভাবে ব্যতিক্রমগুলি C++ এ কাজ করে

  2. Pry এ ব্যতিক্রমের সাথে কাজ করা

  3. রুবিতে কাস্টম ব্যতিক্রম

  4. রুবিতে ব্যতিক্রমগুলিতে প্রসঙ্গ ডেটা কীভাবে যুক্ত করবেন