Perlの最適化の概要

Perlコアの最適化をまとめておく。

まず,opcodeの最適化を主に行っているのは,op.cPerl_peep()である。ただし,これは最適化以外の処理,たとえばuse strict 'subs'の下でベアワードに対して致命的エラーを投げる,なども行っている。

さて,Perl_peep()の最適化はだいたい以下の3パターンである。

  • 不要なopcodeを削除
    • opcodeを構築する際につかわれる,op_stubやop_nullなどのスタブノード
    • op_scalar*1など,実質的な意味を持たないopcode
  • よくあるopcodeパターンを一つにまとめる
    • "reverse sort LIST"において,op_sortの逆順ソートビットを立ててop_reverseを消す*2
    • $arrary[10]などの定数添え字が小さな定数の場合,op_aelemfastに変換してopcodeに添え字を埋め込む
  • データに細工を施す
    • $hash{foo}などの定数キーをShared SVに変換する

このうち,頻出するopcodeパターンを一つにまとめる方法は実装も試験も容易であり,いろいろ試してもいいかもしれない。その場合,「頻出するopcodeパターン」を探すようなプロファイラをまず書く必要があるだろう。

また,現状の最適化器は本格的なコンパイラが行うようなアグレッシブなコード書き換えは行っていないので,それを考慮すると試せることはまだ沢山あるように思う。

*1:CORE::scalar()の実体

*2:sortの最適化についてはOptimization of sort()で解説済み