[Ruby] Time.parse がボトルネックになったので・・・

by tanabe on November 29, 2007

ログの解析で Ruby を使っているんだけど、二時間かかって死ねる。繰り返し呼んでいる Time.parse がボトルネックみたいなんだけど、どうにかならない?って依頼が来た。

Time.parse は柔軟性ありまくりで便利すぎるから、そりゃ、速度は諦めないとねーと思いつつ、対応案でこんなのを出してみた。

t = "2007/11/28 15:30:28.015".split(/[\/ :.]/)
Time.utc(*t)
t = "2007/11/28 15:30:28.015".split(/[\/ :.]/)
usec = t.last.to_i * 1000
t.last.replace usec.to_s
Time.utc(*t)

無事、劇的に改善。

そういえば、DateTime.strptime てのもあったなーと思い試してみると、むしろ Time.parse よりも遅かった。

ついでに、実行速度といえば VM だよね。ということで、CRuby と JRuby と YARV で比較してみたところ、CRuby と YARV だと少しだけ YARV が速い。JRuby は大体その二倍程度の時間がかかった。

さらに、おまけで JRuby のバグ(?)発見。

t = "2007/11/28 15:30:28"
DateTime.strptime(t, "%Y/%m/%d %H:%M:%S")

が、失敗する。

自分のコードもバグってたので修正。