Instrumentsでメモリ削減効果をチェックしてみる


Mac OS Xにはビジュアルなプロファイラ(instruments)が付属してくるので、これを使ってプログラムの実行中のデータを収集することができる。
nmoshにはプログラムの(top-levelの)長さに比例してスタックを消費するという地味な問題があり、今回これを修正してみた。

要するに、fluid-letによって"変更されたデータを元に戻す継続"が溜っていくので、末尾再帰のように書かれているloop(名前つきlet)が実際には末尾再帰になっていないことが問題となる。loopは末尾再帰でのみ呼ばれることが保証されているので、これを含むfluid-letは単にset!に置き換えることができる。(この辺は記述性と効率のトレードオフと言える。。)
で、この変更を行うと確かにスタック消費量は減る(moshの報告するスタック増分は半分程度になる)が、ヒープの消費量は殆ど変化しなかった。。VMスタックはヒープ全体から見ると大して大きくないので、GCの掛かるタイミングによる誤差に埋もれてしまう。追記 : そもそも、通常のシチュエーションではBoehm GCはメモリをOSに返さない(munmapしない)ので、瞬間最大風速が変化していない くらいの表現の方が正確だろう。
今気付いたけど64bitカーネルではShark(より細粒度のプロファイラ)が使えないようだ。

  • Shark does not work on the 64-bit kernel.

このリリースノートはかなり古いが、手元のMac miniでも起動しない。
↑のスクリーンショットで観察できるように、普通の時間的プロファイラとして使うこともできる。Boehm GCが大量の時間を消費しているようにみえる。もっとも、これは見え方の問題とも言える。。