2008年12月9日火曜日

【PAIP】10 Low-Level Efficiency Issues


  • 10.1 Use Declarations
  • 宣言によるコンパイラの振舞いの違い。新しい知見は無いが、こういう話は面白く感じる。

  • 10.2 Avoid Generic Functions
  • 表題のとおり。半ページしかない。

  • 10.3 Avoid Complex Argument Lists
  • えっと、まず、効率化を考えるときはdisassembleをいろいろしてみて、コンパイラの振舞いをしることが重要そうだ。
  • そしてこの節では、関数の引数リストは結構ハイコストよ、ということ。
  • keyword parameterがもっともコストが高い。しかしkeyword parameterを使いたいときもある。そういうときは、keywordパラメータをもったものはフロントエンドとして、処理本体は別関数にするなどの手法があるよ。

  • 10.4 Avoid Unnecessary Consing
  • 要点をピックアップ

    • nondestructiveではなくdestructiveな関数を使って対処。
    • appendは非効率的。accumulatorを使って書き直せる。経験豊かなLisperはこういうのに慣れてる。
    • GC機構によって何が速いかはかわってくる。場合によっては、nreverseよりもreverseの方が速い。timeせよ。
    • ※P330〜P331のvectorの例は、aclでは、:adjustable tをつけないとエラーになる。
    • *uniq-cons-table*をつくって、consをreuseする。(ここまでするのか)
    • 多値で返すということは、consなどの構造を作らないので節約になる。
    • リソース(プール)を作る。



とりあえず、ここまで。平日に少し進めた。。。
次回は、10.5 Use the Right Data Structures から。

0 件のコメント: