longlife gc patchを少し試しました。
http://d.hatena.ne.jp/authorNari/20090511/1242054805
ruby-1.9.1-p0で試してみました。そのままの方がruby-1.9.1、patchあてたものをruby-partialとしています。
ao-bench*1の結果。
% time ruby-1.9.1 ao-render.rb >ao.ppm 6:03.64 user 0.012 system 6:03.41 total % time ruby-partial ao-render.rb >ao.ppm 4:58.58 user 0.000 system 4:58.37
1分くらい速くなっているようです。
htmlcompact*2にPHPのSingle HTML File版日本語マニュアルを*3を処理させた結果。
% time ruby-1.9.1 compacttest.rb php_manual_ja.html php_compact.html 2:01.77 user 0.632 system 2:02.81 total % time ruby-partial compacttest.rb php_manual_ja.html php_compact.html 2:08.56 user 0.552 system 2:09.02 total
ほぼ変わらず?
参考になるのかならないのか、ruby-1.9.1-p0を-pg付きでビルドしてao-bench、htmlcompactをやったときの結果があります。
http://konbu.s13.xrea.com/lib/ruby/ao-render-gprof.log.bz2
http://konbu.s13.xrea.com/lib/ruby/compact_php_man-gprof.log.bz2
GCにかかった時間だけ見るとGCにかかった時間は
- ao-bench
- 29.8%
- htmlcompact
- 18.1%
でしょうか。
~ % cat /proc/cpuinfo processor : 0 vendor_id : AuthenticAMD cpu family : 15 model : 43 model name : AMD Athlon(tm)64 X2 Dual Core Processor 4600+ stepping : 1 cpu MHz : 2411.115 cache size : 512 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_legacy bogomips : 4822.23 clflush size : 64 power management: ts fid vid ttp processor : 1 vendor_id : AuthenticAMD cpu family : 15 model : 43 model name : AMD Athlon(tm)64 X2 Dual Core Processor 4600+ stepping : 1 cpu MHz : 2411.115 cache size : 512 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 apicid : 1 initial apicid : 1 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 1 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm cmp_legacy bogomips : 4822.18 clflush size : 64 power management: ts fid vid ttp % uname -a Linux hogehoge 2.6.29-1-686 #1 SMP Fri Apr 17 14:35:16 UTC 2009 i686 GNU/Linux
こんなDebian GNU/Linux環境です。
追記 ao-render.rbについて
コード中でrand使ってるので微妙に結果違ってくるのがちょっと気になる。何回か実行しても(記録してないですが)だいたい同じだったので結果も大幅には違ってこないと思いますけど。実験とかのために再現性ある疑似乱数生成の手法が欲しいけどあるんだろか。
追記2
srandに適当な定数与えればいいんでしたね。呆けてました。
追記3
プログラムの始めでsrand 10としてみた結果。
% time ruby-1.9.1 ao-render.rb >ao1.ppm 6:02.07 user 0.252 system 6:02.07 total % time ruby-partial ao-render.rb >ao2.ppm 5:01.81 user 0.384 system 5:01.97 total % cmp ao1.ppm ao2.ppm
同じ結果がちゃんと出ていて60秒も速くなっている。
% time (ruby-1.9.1 -e'GC::Profiler.enable;load("ao-render.rb");GC::Profiler.report(STDERR)' >ao3.ppm 2>ao3.gcreport) 6:05.15 user 1.844 system 6:06.72 total % time (ruby-partial -e'GC::Profiler.enable;load("ao-render.rb");GC::Profiler.report(STDERR)' >ao4.ppm 2>ao4.gcreport) 5:03.65 user 1.112 system 5:04.55 total % cmp ao1.ppm ao3.ppm&&cmp ao1.ppm ao4.ppm&&cmp ao2.ppm ao3.ppm&&cmp ao3.ppm ao4.ppm %
% cat ao3.gcreport # ruby-1.9.1 GC 164213 invokes. Index Invoke Time(sec) Use Size(byte) Total Size(byte) Total Object GC Time(ms) 1 0.004 216740 344064 17199 3.99999999999999911182 ... 164212 364.347 8313340 8339456 416871 44.00300000000773081865 % cat ao4.gcreport # ruby-partial GC 69520 invokes. Index Invoke Time(sec) Use Size(byte) Total Size(byte) Total Object GC Time(ms) 1 0.004 217240 311296 15561 0.00000000000000000000 ... 69520 303.363 2940460 3014656 150696 12.00000000001061373212 % ruby-1.9.1 -e 'sum=0.0;ARGF.each{|line|sum += (line=~/([\d.]+)$/ ? $1.to_f : 0.0)};p sum' ao3.gcreport 132316.195000496 % ruby-1.9.1 -e 'sum=0.0;ARGF.each{|line|sum += (line=~/([\d.]+)$/ ? $1.to_f : 0.0)};p sum' ao4.gcreport 67312.1810001647
処理系 | GC回数 | 総GC時間(ms) | 平均GC時間(ms) |
---|---|---|---|
1.9.1-p0 | 164212 | 132316.195 | 0.80576 |
longlife-partial | 69520 | 67312.181 | 0.96824 |
ですかね。ao-benchはとにかく浮動小数点数演算をしまくるので、Floatのオブジェクトを作りまくってGCしまくります。ささださんの「Ruby処理系での軽量な浮動小数点数表現」*4を導入したらまた相当違ってくると思いますけど。