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*2PHPの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を導入したらまた相当違ってくると思いますけど。

test