「Perl/XSが得意なこと」の補足

Perl/XSが得意なことはほとんどオレオレ用語といっていいくらい端折ったリストなので追々補足しておく。
まずひとつ,「注意を払う」というのは内部で呼ばれるmalloc()を極力減らすという意味と書いたが,よく考えてみればこれはmalloc()*1が遅いというのが問題なのではない*2malloc()はそれだけで終わるものではなく,mallo()を呼ぶAPIの内部または前後ではデータのコピーが伴うのが普通だし,その前にSVの割りあてが必要だったり,あるいは一時SVを使うとなればENTER+SAVETMPS ... FREETMPS+LEAVEといったブロックスコープ管理ルーチンが伴ったりと,付随する様々な処理が加わることが極めて多い。だから避けるべきなのはmalloc()そのものというより,malloc()に付随する膨大な処理である。

具体的には,たとえばMOP.xsでは,メソッドやハッシュキーをその都度生成して破棄するのではなく,XSのbootの際にSVを予め確保しておき,そのSVを使いまわすようにしている*3。またData::Util::is_instance($x, $class)では,関数の設計段階で新しいSVを作らないようにし,ほぼ同等の機能を持つParams::Util::_INSTANCE($x, $class)が第一引数を返すのに対し,Data::Util::is_instance($x, $class)は真偽値を返す*4

*1:またはmalloc()が内部で使用するシステムコール

*2:なお,この記事を書くのにあたってプロファイルを取るなどの調査はしておらず,専らベンチマークの経験に基づく。

*3:ただし,ハッシュキーについてはその都度SVを生成することはないので,通常は事前に確保しておく必要はない。MOPでハッシュキーを予め確保しておくのは,単にハッシュ値を計算しておくためである。

*4:ただし,$xが$classのインスタンスであれば第一引数を返し,そうでなければconfess()するData::Util::instance()もある。