Kazuki Ohta
mover****@hct*****
2005年 8月 8日 (月) 00:31:27 JST
太田です。少し体調不良で休んでおりました。 > sigscheme/ の中は大体読んだので、GC 周りを最適化してみました。 おぉ、有難う御座います。気になった点等有りましたらどんどん指摘して頂けると有難いです。 > sscm-gcopt.diff を当てると、gc_preprocess() が 40 億回に 1 回しかヒープ > を走査しなくなります。ただし gcmark がenum でなくなっています。enum のま > までもエラーは出ないでしょうけど、意味的に違う気がしたので。 > > sscm-gcopt-bench.diff に簡易ベンチマークを含めてあります。(警告されます > が、sscm-gcopt.diff と独立に当てられます) > > sscm n > > で、cons を作っては破棄、を n 回繰り返す所要時間、 > > sscm -r n > > で、cons を作って全部リンク(破棄しない)、を n 回繰り返す所要時間を表示し > ます。これで比較すると前者では 14%、この最適化に有利な後者では 43% 時間 > が短縮されました。 > > 実際に 2^32 回 GC されたケースも初期値をいじることでテストしてあります……一応 gc_preprocessはいずれ対処しなければと思っていたのですが、やっていただけて嬉しいです。 非常にうまい仕組みで感心致しました。r1155でcommitさせて頂きました。 > ところで、posix_memalign() についてちょっとググってみたところ、この関数 > は一部の BSD variant では用意されていないようです。それどころか > posix_memalign(), valloc(), memalign() のいずれも持ってないシステムがあ > るそうで、そのシステムでは代わりに malloc() が 1 ページ以上の大きさのブ > ロックは必ずページ境界に揃えて返すそうです。(参考: > AX_CHECK_PAGE_ALIGNED_MALLOC) > > よって AX_CHECK_PAGE_ALIGNED_MALLOC を導入するか、少しだけ余分に確保して > 自分で align するかしか無いと思います。でもこの malloc_aligned() ってそ > もそも要らないのでは? 大抵のシステムでは 8 バイトにあわせたポインタが > 返ってきますし、そうでない場合もそれほどパフォーマンスに影響はないと思い > ます(そうでなければシステム全体が恐ろしく遅いということになりますから)。 posix_memalignは元々tagged pointerを実現する為に使用していたのですが、開発途中で tagged pointerの実装を後回しにする方針に転換したので、コードの残骸が残っていたという のが現状です。将来的にtagged pointerを使用したいと思っているので、その時は少しだけ余 分に確保して自前でalignしようと思っています。 パッチ、有難う御座いますm(_ _)m ------------------------------------------------- Kazuki Ohta : mover****@hct***** -------------------------------------------------