回答:
すでに述べたように、Time
数値(または浮動小数点)値であるかのようにオブジェクトを操作できます。これらの操作により、簡単に変換できる2番目の解像度が得られます。
例えば:
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
それを切り捨てるかどうかを決定する必要があります。
finish.to_f - start.to_f
?
finish - start
浮動小数点を生成します。.to_f
冗長になります。
(t2 - t1).in_milliseconds
私は答えが間違って選択されていると思います、その方法はミリ秒ではなく秒を与えます。
t = Time.now.to_f
=> 1382471965.146
ここでは、浮動小数点値がミリ秒であると仮定します
Time.now
すると、時間は小数点の前の秒と小数点の後のナノ秒までの浮動小数点値として扱われます(ただし、nsecは完全に正確ではない場合があります)。したがって、その値を掛けると1000.0
ミリ秒になります。
ezpzの答えはほぼ完璧ですが、もう少し追加できるといいのですが。
Geoはミリ秒単位の時間について尋ねました。これは整数の量のように聞こえ、私は浮動小数点の土地を迂回することはしません。したがって、私のアプローチは:
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を掛けると、小数が完全に保持され、少し速くなる場合もあります。
日付と時刻を処理する場合は、DateTimeクラスを使用する必要がある場合があります。これは同様に機能しますが、変換係数は24 * 3600 * 1000 = 86400000です。
DateTimeのstrptime関数とstrftime関数は、日付/時刻文字列(ログへ/からのログなど)の解析とフォーマットに非常に役立つことがわかりました。知っておくと便利なのは:
これらの関数(%H、%M、%S、...)のフォーマット文字は、Unix / LinuxシステムにあるC関数とほとんど同じです。そして
さらにいくつかあります:特に、%Lはミリ秒を実行します!
unknown
:)
DateTime.now.strftime("%Q")
使用例:
>> DateTime.now.strftime("%Q")
=> "1541433332357"
>> DateTime.now.strftime("%Q").to_i
=> 1541433332357
Time.now.to_fは役立ちますが、秒数を返します。
一般的に、ベンチマークで作業するとき、私は:
それは非常に単純なプロセスなので、あなたが本当にこれを求めていたのかわかりません...
%L
ルビでミリ秒を与える
require 'time'
puts Time.now.strftime("%Y-%m-%dT%H:%M:%S.%L")
または
puts Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")
ミリ秒単位の現在のタイムスタンプが表示されます。
答えは次のようなものです:
t_start = Time.now
# time-consuming operation
t_end = Time.now
milliseconds = (t_start - t_end) * 1000.0
しかし Time.now
アプローチは不正確になるリスクがあります。Luca Guidiがこの投稿を見つけました:
https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/
システムクロックは常に変動し、順方向にしか移動しません。経過時間の計算がそれに基づいている場合は、計算エラーまたは機能停止に遭遇する可能性が非常に高くなります。
そのため、Process.clock_gettime
代わりに使用することをお勧めします。何かのようなもの:
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
例:
elapsed = measure_time do
# your time-consuming task here:
sleep 2.2321
end
=> 2.232