パフォーマンスに敏感な TTL キャッシュを最適化しています。プロファイラーによると、時間の約 25% が で費やされTime.now
、存続Time#to_f
時間の計算に使用されます。
Time
派手なオブジェクトではなく、単純な数値形式 (任意の粒度) で Ruby MRI の現在の時刻を取得する信頼できる方法はありますか?
パフォーマンスに敏感な TTL キャッシュを最適化しています。プロファイラーによると、時間の約 25% が で費やされTime.now
、存続Time#to_f
時間の計算に使用されます。
Time
派手なオブジェクトではなく、単純な数値形式 (任意の粒度) で Ruby MRI の現在の時刻を取得する信頼できる方法はありますか?
あなたの質問からは、本当に必要なパフォーマンスの種類、またはコードがそのレベルのパフォーマンスを提供できない理由が明確ではありません。MRI は、ほとんどのユース ケースで十分なパフォーマンスを発揮します。特別なユースケースがあり、以下の提案がどれもうまくいかない場合は、コードの前提を再検討するか、Ruby インタープリターが本当にマイクロ秒単位のパフォーマンスを必要とするジョブに適したツールであるかどうかを判断することをお勧めします。ナノ秒範囲。
通常、Ruby はコード実行が最速というわけではありませんが、通常は「十分に高速」です。私のシステムでは、MRI は平均 2 ミリ秒以内に1,000 個のTimeオブジェクトを返します。たとえば、MRI は次のように報告します。
require 'benchmark'
Benchmark.measure do 1_000.times { t = Time.now.to_f } end
=> #<Benchmark::Tms:0x00000000be2f30
@cstime=0.0,
@cutime=0.0,
@label="",
@real=0.001831756,
@stime=0.0,
@total=0.0,
@utime=0.0>
マイクロ秒の範囲内に収まるベンチマーク時間を一貫して取得します200.times
。これは、考慮に値するいくつかのことを示唆しています。
つまり、問題を再考して、Ruby の部分が時間に左右されないようにすることができるかもしれません。Ruby には、他のプロセスやアプリケーションとの通信を可能にする多くの機能があり、プロセス間通信を使用すると、必要なアクションを非同期で実行するのに役立つ場合があります。