ログの解析で 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")
が、失敗する。
自分のコードもバグってたので修正。