プロファイル
rubyプログラム中でrequire 'profile'と書くだけでプログラム実行に対するプロファイリング結果が標準出力に表示されます。
5月29日の「テストデータ作成」で書いた記事の改良版の方がなんとなく早そうな気はしてたんですが、実際のところどうなんやろ、と思って計ってみました。
10240.times{ f << "a" }
とした方(1024*1024*10は遅すぎたので10KBのファイル出力にした)の結果は、
% cumulative self self total time seconds seconds calls ms/call ms/call name 44.70 0.59 0.59 1 594.00 1329.00 Integer#times 38.83 1.11 0.52 10240 0.05 0.07 IO#<< 16.48 1.33 0.22 10240 0.02 0.02 IO#write 0.00 1.33 0.00 1 0.00 1329.00 IO#open 0.00 1.33 0.00 1 0.00 0.00 IO#close 0.00 1.33 0.00 1 0.00 0.00 File#initialize 0.00 1.33 0.00 1 0.00 1329.00 #toplevel
となり、確かに<<メソッドが10240回呼ばれているのが分かります。1秒33かかってますねー。
一方、
f << "a" * 10240
とした方の結果は、
% cumulative self self total time seconds seconds calls ms/call ms/call name 0.00 0.00 0.00 1 0.00 0.00 String#* 0.00 0.00 0.00 1 0.00 0.00 File#initialize 0.00 0.00 0.00 1 0.00 0.00 IO#close 0.00 0.00 0.00 1 0.00 0.00 IO#open 0.00 0.00 0.00 1 0.00 0.00 IO#<< 0.00 0.00 0.00 1 0.00 0.00 IO#write 0.00 0.01 0.00 1 0.00 10.00 #toplevel
となりました。やっぱこっちの方が断然早いですね。