1

与えられたデータをツリー表現に変換する私のアプリケーションは、メモリを使いすぎています。クラッシュする前に、約 200 ~ 300 MB のメモリを約 3 GB に変換することができます。

私は今、リークがどこにあるのか、プログラムのどの部分が原因なのかを突き止めたいと思っています。

したがって、sbcl を使用して common-lisp でメモリをプロファイリングするための最も一般的で効率的な手法は何でしょうか?

私はすでに見ましたが(room)(time)その出力は冗長です。必要なのは、「実行後の全体的なメモリ使用量は+1000バイトでした」と言うラッパーだけです。メモリがどこにあるかを知りたいだけなので、これで対処できます。使用済み。もう 1 つの基準は、RAM が残っていないためにアプリケーションがクラッシュする可能性が高いため、「オンザフライ」で動作する必要があることです。

このようなもの:

(dotimes (i 4)
  (profiler-wrapper :messg "After execution memory ~a~%"  (execute-me i) ))

After execution memory +100Mb
After execution memory +100Mb
After execution memory +100Mb
After execution memory +100Mb
NIL
4

2 に答える 2

2

slime-profile*コマンドまたはREPLを介してSlimeで使用できる決定論的プロファイラーを試してください。ラッピングを実行し、ラッピングのオーバーヘッドをいくらか犠牲にして、関数ごとのCPUとメモリの使用量をレポートできます。

SBCLには、オーバーヘッドが少なく、実行時間の長いプロセスを分析する必要があり、問題領域に関する事前情報がほとんどまたはまったくない場合に役立つ統計プロファイラーも付属しています。

于 2012-12-09T07:49:57.693 に答える
1

私はそのようなマクロの独自のバージョンを作成しました。おそらくエレガントではなく、コード(sb-ext:gc :full t)が大幅に遅くなりますが、特定の本体の実行後のメモリ使用量についてある程度の見通しが得られます。

(defparameter *last-profile-step* 0)

(defmacro profile-it ((name gc-on) &body body)
    `(let ((*last-profile-step* ,(if gc-on
                     `(progn
                    (sb-ext:gc :full t)
                    (sb-kernel::dynamic-usage))
                     `(sb-kernel::dynamic-usage))))
       (unwind-protect 
        (progn
          ,@body)
     (progn
       (FORMAT t "After execution of ~a : ~a byte~%" ,name
           (- ,(if gc-on
               `(progn
                  (sb-ext:gc :full t)
                  (sb-kernel::dynamic-usage))
               `(sb-kernel::dynamic-usage))
              *last-profile-step* ))))))
于 2012-12-08T21:41:53.227 に答える