Şuradan aldığım bir Timenesne varsa :
Time.now
ve daha sonra aynı satırla başka bir nesneyi somutlaştırıyorum, kaç milisaniyenin geçtiğini nasıl görebilirim? İkinci nesne aynı dakika, sonraki dakikalar ve hatta saatler içinde oluşturulabilir.
Yanıtlar:
Daha önce belirtildiği Timegibi , nesneler üzerinde sayısal (veya kayan nokta) değerlermiş gibi işlem yapabilirsiniz. Bu işlemler, kolayca dönüştürülebilen ikinci çözünürlükle sonuçlanır.
Örneğin:
def time_diff_milli(start, finish)
(finish - start) * 1000.0
end
t1 = Time.now
# arbitrary elapsed time
t2 = Time.now
msecs = time_diff_milli t1, t2
Bunu kesip kesmeyeceğinize karar vermeniz gerekecek.
finish.to_f - start.to_f?
finish - startkayan nokta verir; .to_fgereksiz olacaktır.
(t2 - t1).in_milliseconds
Cevabın yanlış seçilmiş olduğunu düşünüyorum, bu yöntem milisaniye değil saniye veriyor.
t = Time.now.to_f
=> 1382471965.146
Burada kayan değerin milisaniye olduğunu varsayıyorum
Time.nowişleminin kullanılması, zamanı, ondalık noktadan önce ve ondalık noktadan sonra nanosaniye olmak üzere kayan nokta değerleri olarak ele almaktır (nsec tam olarak doğru olmayabilir). Yani bu değeri 1000.0milisaniye ile çarpmak, verir.
Milisaniye cinsinden zaman elde etmek için eklemek daha iyidir .round(3), bu nedenle bazı durumlarda daha doğru olacaktır:
puts Time.now.to_f # => 1453402722.577573
(Time.now.to_f.round(3)*1000).to_i # => 1453402722578
ezpz'in cevabı neredeyse mükemmel, ama umarım biraz daha ekleyebilirim.
Geo milisaniye cinsinden zamanı sordu; bu bir tamsayı miktarı gibi geliyor ve ben dolambaçlı yoldan kayan noktalı araziden geçmem. Dolayısıyla benim yaklaşımım şöyle olurdu:
irb(main):038:0> t8 = Time.now
=> Sun Nov 01 15:18:04 +0100 2009
irb(main):039:0> t9 = Time.now
=> Sun Nov 01 15:18:18 +0100 2009
irb(main):040:0> dif = t9 - t8
=> 13.940166
irb(main):041:0> (1000 * dif).to_i
=> 13940
1000 tamsayısıyla çarpmak, kesirli sayıyı mükemmel bir şekilde korur ve biraz daha hızlı olabilir.
Tarihler ve saatlerle uğraşıyorsanız, DateTime sınıfını kullanmanız gerekebilir . Bu benzer şekilde çalışır ancak dönüştürme faktörü 24 * 3600 * 1000 = 86400000'dir .
DateTime'ın strptime ve strftime işlevlerini tarih / saat dizgilerini ayrıştırmada ve biçimlendirmede paha biçilemez buldum (örneğin, günlüklere / günlüklerden). Bilmesi yararlı olan şey şudur:
Bu işlevlerin biçimlendirme karakterleri (% H,% M,% S, ...) herhangi bir Unix / Linux sisteminde bulunan C işlevleriyle hemen hemen aynıdır; ve
Birkaç tane daha var: Özellikle, % L milisaniye yapar!
unknown:)
%L Ruby'de milisaniye verir
require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")
veya
puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")
milisaniye cinsinden güncel zaman damgasını verecektir.
DateTime.now.strftime("%Q")
Örnek kullanım:
>> DateTime.now.strftime("%Q")
=> "1541433332357"
>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
Time.now.to_f size yardımcı olabilir, ancak saniye döndürür.
Genel olarak, kıyaslamalarla çalışırken:
Bu çok basit bir süreç, bu yüzden gerçekten bunu sorduğundan emin değilim ...
Cevap şuna benzer:
t_start = Time.now
# time-consuming operation
t_end = Time.now
milliseconds = (t_start - t_end) * 1000.0
Ancak Time.now yaklaşımın yanlış olma riski vardır. Bu gönderiyi Luca Guidi tarafından buldum:
https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/
sistem saati sürekli yüzer ve sadece ileriye doğru hareket etmez. Geçen süre hesaplamanız buna dayanıyorsa, hesaplama hatalarıyla ve hatta kesintilerle karşılaşmanız çok olasıdır .
Bu yüzden Process.clock_gettimebunun yerine kullanılması tavsiye edilir . Gibi bir şey:
def measure_time
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
yield
end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
elapsed_time = end_time - start_time
elapsed_time.round(3)
end
Misal:
elapsed = measure_time do
# your time-consuming task here:
sleep 2.2321
end
=> 2.232