Lispオプティマイザの動作-BricsCAD
Lispオプティマイザの動作原理
Lisp Optimiser は Lisp ファイル内の (defun ...) コードブロックのみを対象としていて、コマンドラインや (defun ...) ブロックの外から入力されたLisp式は分析されない。
デフォルトでは、(load ...) 文によって読み込まれたLispファイルに対してLispオプティマイザが有効になる。
オプティマイザーを無効にするには、(vle-optimiser nil) とすると、直ちに有効になり、再び有効になるまでコードの最適化を抑制する。 Lispファイルが読み込まれると、Lispオプティマイザは自動的にリセットされ、再び有効な状態に戻る。
Lispファイルが (load ...) で他のLispファイルをロードした場合、Lispオプティマイザは自動的にサブロードされたLispファイルに対して(再)有効化される。 そのファイルのロードが終了すると、LispオプティマイザはメインとなるLispファイルの元の状態に戻る - つまり、各Lispファイルに対してオプティマイザは独自の状態を維持する
Lispファイルのロードが完了し、Optimiserで処理された後、Lispコードはメモリ上にそのまま残り、それ以上の処理は行われない。
(他のCADシステムでは、(vle-optimiser t/nil) 関数は No-Operation で、 vle-extension.lsp ファイルで提供される)
Lisp Optimiserが有効なLispファイルをロードする場合 :
ファイルから読み込まれた各 (defun ...) ブロックに対して、Lisp Optimiser は defun ブロックの評価をインターセプトし、Lisp コードを解析して既知の非効率的なパターンを検出する。主な目的は、性能向上とメモリ負荷の軽減であり、メモリ負荷の代償として性能を向上させるという選択肢はない。
もちろん、このロードタイム解析は若干の性能の犠牲となり、Lispファイルのロードが若干遅くなる(平均してロード時間は5%以下程度に増加する)。
Bricsysの自動テストシステムは、Lisp Optimiserの正しい動作を監視・検証するための専用テストを含んでおり、各最適化ケースは複数のテストによってカバーされている。
現在処理されているコードパターンは、最適化されたコードパターンを参照。
また、Lispベンチマークには、ロードタイム最適化の効果を検証するための専用ベンチマークが含まれている。