Bagaimana saya bisa mengukur waktu yang dibutuhkan oleh sebuah metode dan pernyataan individu dalam metode itu di Ruby. Jika Anda melihat metode di bawah ini, saya ingin mengukur total waktu yang dibutuhkan oleh metode dan waktu yang dibutuhkan untuk akses database dan akses redis. Saya tidak ingin menulis Benchmark.measure sebelum setiap pernyataan. Apakah penerjemah ruby memberi kita kaitan untuk melakukan ini?
def foo
# code to access database
# code to access redis.
end
new Date()
javascript yang dimiliki ruby, tetapi saya tidak dapat mengingat sintaks yang benar. harus memberi Anda daftar google yang layak meskipunJawaban:
Anda bisa menggunakan
Time
benda itu. ( Dokumen Waktu )Sebagai contoh,
start = Time.now # code to time finish = Time.now diff = finish - start
diff
akan menjadi dalam hitungan detik, sebagai angka floating point.EDIT:
end
sudah dipesan.sumber
end
dicadangkan, jadi gunakan beberapa nama variabel lainnya.Time.now
dipengaruhi oleh penyesuaian pada jam sistem, jadi sebaiknya gunakanlah praktik terbaikProcess.clock_gettime(Process::CLOCK_MONOTONIC)
. Tetapi untuk perhitungan kasar ini tidak masalah. blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-wayCara termudah:
require 'benchmark' def foo time = Benchmark.measure { code to test } puts time.real #or save it to logs end
Output sampel:
2.2.3 :001 > foo 5.230000 0.020000 5.250000 ( 5.274806)
Nilai-nilainya adalah: waktu cpu, waktu sistem, total dan waktu yang telah berlalu.
Sumber: ruby docs .
sumber
Benchmark.realtime { block }
jika Anda hanya menginginkan realtimeGunakan
Benchmark
Laporanrequire '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
Ini akan menghasilkan sesuatu seperti berikut:
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.
Informasi lebih lanjut dapat ditemukan di sini .
sumber
Benchmark
kelas menggunakan jam monotonik, seperti yang dibahas dalam jawaban lain. Lihat misalnya kode sumber berikut, dan cari "ukuran def" pada baris 286: github.com/ruby/ruby/blob/ruby_2_2/lib/benchmark.rbBanyak dari jawaban menyarankan penggunaan
Time.now
. Tetapi perlu disadari bahwa ituTime.now
bisa berubah. Jam sistem dapat melayang dan mungkin dikoreksi oleh administrator sistem atau melalui NTP. Oleh karena itu, Time.now mungkin saja melompat maju atau mundur dan memberikan hasil yang tidak akurat kepada pembandingan Anda.Solusi yang lebih baik adalah dengan menggunakan jam monotonik sistem operasi, yang selalu bergerak maju. Ruby 2.1 dan yang lebih baru memberikan akses ke ini melalui:
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
Anda dapat membaca lebih detail di sini . Anda juga dapat melihat proyek Ruby yang populer, Sidekiq, beralih ke jam monotonik .
sumber
Pikiran kedua, tentukan fungsi measure () dengan argumen blok kode Ruby dapat membantu menyederhanakan kode pengukuran waktu:
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
sumber
benchmark
. Saat Anda menggunakannya, itu disebutmeasure
. Tolong perbaiki ini.Dengan semangat jawaban wquist , tetapi sedikit lebih sederhana, Anda juga bisa melakukannya seperti di bawah ini:
start = Time.now # code to time Time.now - start
sumber
Lihatlah ke dalam
ruby-prof
paketnya, itu harus memiliki apa yang Anda butuhkan. Ini akan membuat tumpukan panggilan besar dengan pengaturan waktu.http://ruby-prof.rubyforge.org/
Mungkin terlalu terperinci, dalam hal ini hanya membungkus bagian yang lebih besar
Benchmark.measure
mungkin merupakan cara yang baik untuk melakukannya.sumber
Metode lain bagaimana cara benchmark kode secara otomatis di konsol rel menggunakan permata ini: https://github.com/igorkasyanchuk/execution_time
Anda akan melihat info serupa seperti yang Anda dapatkan dari permintaan di log
sumber