optimize前回の続き。githubにあるloopの簡易版を載せておく。基本的なJava等のIteratorと似た*1インタフェースを通してループ処理を実現している。speedマージソート(1)の改良版。ソートのような高階関数では、引数で渡した比較関数の間接呼び出しのコストも実行速度にそれなりの影響を与えるので、それを(マクロをほとんど使わずに)できるだけ低く抑えるための試み。optimize以下、sbcl-1.0.51-x86-64-linuxでの実行結果。lispプログラムを載せたら「inline宣言を付けるともっと早くなりますよ」というコメントを頂いたので試してみた。通常は構造体のインスタンスを作成するとヒープ上にそのための領域が割り当てられる。optimize関数を書いていると、引数の型チェックを有効にするかどうかで悩むことがたまにある。optimizeあまり話題に関連性がないが、一応前々回の続き。sbcl(1.0.37)での文字列関連の型の階層は以下のようになっている*1。lispではハッシュが使い難い(と思う)。その理由の一つは、リストのようにマッピング関数がない*1せいだと思うので、そのための関数を定義。ユーティリティ関数っぽくいろいろ装飾。optimize前回と重複するところがあるが、ftype型宣言の有用な使い方について書いておく。ftype型宣言を使うと、関数の戻り値の型を指定することができる。optimizeftype型宣言。使われているのを見ない気がするが、これを使うと「型宣言なしでは遅いけど、宣言をつけるとコードが汚くなる」というような問題を解決できる時があるので、少し書いておく。以下はsbcl(1.0.34)での挙動。実行速度の比較』*1というページに触発され、lisp(sbcl-1.0.28)でも同様の比較を行ってみた。C++のソースコードは、上記ページのものと同様だが、g++のオプションには'-O3'を渡している。optimize最近のバージョンのSBCL*1では、処理速度を最優先にする宣言を行って関数をコンパイルした場合でも、デフォルトではコンパイラノート*2が表示されないことがある*3。optimizesbcl(1.0.28)は、適切に型宣言を行っておけば、冗長な型判定を実行コードから除外してくれるようだ。次のようなマクロを定義する。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。