1

パフォーマンスに敏感な TTL キャッシュを最適化しています。プロファイラーによると、時間の約 25% が で費やされTime.now、存続Time#to_f時間の計算に使用されます。

Time派手なオブジェクトではなく、単純な数値形式 (任意の粒度) で Ruby MRI の現在の時刻を取得する信頼できる方法はありますか?

4

2 に答える 2

2

TL;DR

あなたの質問からは、本当に必要なパフォーマンスの種類、またはコードがそのレベルのパフォーマンスを提供できない理由が明確ではありません。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。これは、考慮に値するいくつかのことを示唆しています。

  1. ポーリングの回数を減らすと役立つ場合があります。
  2. ソケットまたはパイプを使用して、より高速なプロセスから Ruby にデータをフィードすることは、有用なアプローチかもしれません。
  3. C の速度で実行されるバックグラウンド プロセスを Ruby に生成させたい場合があります。
  4. いつでも独自のネイティブ拡張機能を作成できます。

つまり、問題を再考して、Ruby の部分が時間に左右されないようにすることができるかもしれません。Ruby には、他のプロセスやアプリケーションとの通信を可能にする多くの機能があり、プロセス間通信を使用すると、必要なアクションを非同期で実行するのに役立つ場合があります。

于 2013-10-13T05:58:08.950 に答える