রুবি পদ্ধতির জন্য পরিমাপ এবং বেঞ্চমার্কের সময়


90

আমি কোনও পদ্ধতিতে নেওয়া সময় এবং রুবিতে সেই পদ্ধতিতে পৃথক বিবৃতি কীভাবে পরিমাপ করতে পারি। আপনি যদি নীচের পদ্ধতিটি দেখেন তবে আমি পদ্ধতিটির দ্বারা নেওয়া মোট সময় এবং ডেটাবেস অ্যাক্সেস এবং পুনরায় অ্যাক্সেসের জন্য নেওয়া সময় পরিমাপ করতে চাই। আমি প্রতিটি বিবৃতি দেওয়ার আগে বেনমার্ক.মাপ লিখতে চাই না। রুবি দোভাষী আমাদের এটি করার জন্য কোনও হুক দেয়?

def foo
# code to access database
# code to access redis. 
end

new Date()রুবীর কাছে জাভাস্ক্রিপ্টের মতো কিছু রয়েছে তবে আমি সঠিক বাক্য গঠনটি মনে করতে পারি না। আপনি যদি একটি শালীন তালিকা Google দিতে হবে যদিও
রিগ্যান

4
@ ফানি আপনি একটি সঠিক উত্তর চয়ন করতে পারেন দয়া করে? 8 বছর পরে, আমি এখানে কিছু শক্ত উত্তর আছে বলে মনে করি। ধন্যবাদ
জোশুয়া পিন্টার 26'20

উত্তর:


118

আপনি Timeঅবজেক্টটি ব্যবহার করতে পারেন । ( টাইম ডক্স )

উদাহরণ স্বরূপ,

start = Time.now
# code to time
finish = Time.now

diff = finish - start

diff ভাসমান পয়েন্ট সংখ্যা হিসাবে সেকেন্ডে হবে।

সম্পাদনা: endসংরক্ষিত


14
একটি ছোটখাট সংশোধন endসংরক্ষিত, তাই অন্য কিছু চলক নাম ব্যবহার করুন।
জেসন কিম

4
Time.nowসিস্টেম ঘড়ির সাথে সামঞ্জস্য দ্বারা প্রভাবিত হয়, সুতরাং Process.clock_gettime(Process::CLOCK_MONOTONIC)পরিবর্তে এটি ব্যবহার করার জন্য সেরা অনুশীলন । তবে মোটামুটি গণনার জন্য এটি কোনও বিষয় নয়। blog.dnsimple.com/2018/03/elapsed- সময়-
with-ruby-the-

105

সহজ উপায়:

require 'benchmark'

def foo
 time = Benchmark.measure {
  code to test
 }
 puts time.real #or save it to logs
end

নমুনা আউটপুট:

2.2.3 :001 > foo
  5.230000   0.020000   5.250000 (  5.274806)

মানগুলি হ'ল সিপিইউ সময়, সিস্টেমের সময়, মোট এবং বাস্তব সময় অতিবাহিত সময়।

উত্স: রুবি ডক্স


41
আপনি Benchmark.realtime { block }কেবল রিয়েলটাইম চাইলে আপনিও করতে পারেন
jmccure

36

Benchmarkএর রিপোর্ট ব্যবহার করুন

require 'benchmark' # Might be necessary.

def foo
  Benchmark.bm( 20 ) do |bm|  # The 20 is the width of the first column in the output.
    bm.report( "Access Database:" ) do 
      # Code to access database.
    end
   
    bm.report( "Access Redis:" ) do
      # Code to access redis.
    end
  end
end

এটি নিম্নলিখিত মত কিছু আউটপুট হবে:

                        user     system      total        real
Access Database:    0.020000   0.000000   0.020000 (  0.475375)
Access Redis:       0.000000   0.000000   0.000000 (  0.000037)

<------ 20 -------> # This is where the 20 comes in. NOTE: This is not shown in output.

আরও তথ্য এখানে পাওয়া যাবে


4
আমি ঠিক আমার নিজের উত্তরটিতে ফিরে এসেছি এবং বেনমার্ক কীভাবে এটি পরিচালনা করে তা নিয়ে (আবার) মুগ্ধ হয়েছি। রুবিকে ভালোবাসি।
জোশুয়া পিন্টার

4
এটি পছন্দসই উত্তর হওয়া উচিত: কারণ রুবি ২.২-এর হিসাবে Benchmarkক্লাসটি একরকম ঘড়ি ব্যবহার করে, যেমন অন্যান্য উত্তরে আলোচনা করা হয়েছে। উদাহরণস্বরূপ নীচের উত্স কোডটি দেখুন এবং 286 লাইনে "ডিফ মেপে" সন্ধান করুন: github.com/ruby/ruby/blob/ruby_2_2/lib/benchmark.rb
Purplejacket

19

উত্তরগুলির অনেকগুলি ব্যবহারের পরামর্শ দেয় Time.now। তবে সচেতন হওয়াটা মূল্যবানTime.now পরিবর্তন করতে পারে। সিস্টেমের ঘড়িগুলি প্রবাহিত হতে পারে এবং এটি সিস্টেমের প্রশাসক বা এনটিপি-র মাধ্যমে সংশোধন করতে পারে। তাই টাইম.নউয়ের পক্ষে সামনের দিকে বা পিছনে ঝাঁপিয়ে পড়া এবং আপনার বেঞ্চমার্কিংকে ভুল ফলাফল দেওয়া সম্ভব।

অপারেটিং সিস্টেমের মনোোটোনিক ঘড়িটি ব্যবহার করা আরও ভাল সমাধান, যা সর্বদা এগিয়ে চলে। রুবি ২.১ এবং তারপরে এর মাধ্যমে এতে অ্যাক্সেস দিন:

start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
# code to time
finish = Process.clock_gettime(Process::CLOCK_MONOTONIC)
diff = finish - start # gets time is seconds as a float

আপনি এখানে আরও বিশদ পড়তে পারেন । এছাড়াও আপনি জনপ্রিয় রুবি প্রকল্প দেখতে পাচ্ছেন সাইডিকিক, একঘেয়ে ঘড়িতে স্যুইচ করেছেন ।


7

দ্বিতীয় চিন্তা, রুবি কোড ব্লক আর্গুমেন্টের সাথে পরিমাপের () ফাংশনটি সংজ্ঞায়িত করে সময় পরিমাপের কোডটি সহজতর করতে সহায়তা করতে পারে:

def measure(&block)
  start = Time.now
  block.call
  Time.now - start
end

# t1 and t2 is the executing time for the code blocks.
t1 = measure { sleep(1) }

t2 = measure do
  sleep(2)
end

আপনার সংজ্ঞা আপনি এটি কল benchmark। আপনি এটি ব্যবহার করার সময় এটি বলা হয় measure। দয়া করে এটি ঠিক করুন।
স্যান্ড্রো এল

4

আত্মা wquist এর উত্তর , কিন্তু একটু সহজ, আপনার কাছে এটি নীচের মত কাজ করতে পারে:

start = Time.now
# code to time
Time.now - start

এই উত্তরটি প্রশ্নের উত্তর দেওয়ার (সামান্য) ভিন্ন উপায়। আপনি কেবলমাত্র @ wquist এর উত্তর থেকে এটি বের করতে পেরেছেন এর অর্থ এটি বৈধ নয়।
ক্র্যাকমাস্টার

3

মধ্যে তাকান ruby-prof প্যাকেজ, এটি আপনার যা প্রয়োজন থাকা উচিত। এটি সময় সহ বিশাল কল স্ট্যাক তৈরি করবে।

http://ruby-prof.rubyforge.org/

এটি খুব দানাদার হতে পারে, সেক্ষেত্রে কেবল বৃহত্তর বিভাগগুলিকে মোড়ানো কেবল Benchmark.measureভাল উপায় হতে পারে।


0

রেল কনসোলে স্বয়ংক্রিয়ভাবে কোডটিকে কীভাবে বেঞ্চমার্ক করবেন তা অন্য পদ্ধতিটি এই রত্নটি ব্যবহার করছে: https://github.com/igorkasyanchuk/execution_time

লগগুলিতে অনুরোধগুলি পাওয়ার সাথে সাথে আপনি অনুরূপ তথ্য দেখতে পাবেন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.