Skip to content
keita edited this page Sep 12, 2010 · 1 revision

HOME

TimeoutX

TimeoutX は軽量な timeout 関数を提供する Ruby のライブラリです。 TimeoutX.timeout は標準的な Timeout.timeout の10倍くらい速いと思います。

インストール


sudo gem install timeoutx

使い方


require "timeoutx" 

TimeoutX.timeout(1){ ... }

Timeout.timeout を TimeoutX.timeout に置き換えるには次のようにして下さい。


require "timeoutx" 
TimeoutX.replace_timeout

Timeout.timeout(1){ ... }

ベンチマーク

2007/12/05 に下の例(examples/benchmark.rb)を使ってとったベンチマークの結果は次のようになります。


n = 100000
Benchmark.bmbm(10) do |x|
  x.report("Timeout") { 1.upto(n) do ; Timeout.timeout(1){true}; end }
  x.report("TimeoutX") { 1.upto(n) do ; TimeoutX.timeout(1){true}; end }
end

ruby 1.8.6


Rehearsal ---------------------------------------------
Timeout     5.960000   0.460000   6.420000 (  6.521520)
TimeoutX    0.780000   0.050000   0.830000 (  0.851778)
------------------------------------ total: 7.250000sec

                user     system      total        real
Timeout     5.650000   0.790000   6.440000 (  6.516992)
TimeoutX    0.760000   0.080000   0.840000 (  0.863438)

ruby 1.9.0


Rehearsal ---------------------------------------------
Timeout    12.140000   2.760000  14.900000 ( 15.333607)
TimeoutX    0.490000   0.010000   0.500000 (  0.518974)
----------------------------------- total: 15.400000sec

                user     system      total        real
Timeout    11.210000   2.390000  13.600000 ( 14.337455)
TimeoutX    0.490000   0.010000   0.500000 (  0.512449)

TimeouX はどうして速いの?

TimeoutX はカウントダウン用のループに一つのスレッドだけしか使いません。普通の timeout.rb は timeout 関数を呼び出すたびに新たなスレッドを作成します。従って例えば10,000回呼び出せば10,000個ものスレッドを生成してしまいます。TimeoutX ライブラリは短時間に timeout をたくさん呼び出す場合に役に立つものと思います。

License

TimeoutX は Ruby ライセンスに従って再配布や修正を行なうことが出来ます。