Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

メモリの最適化に取り組む - SPVM開発日記

インクリメント、特殊代入の実装が無事終わった。

それとexeの生成の試験がCPANでコケまくっているので、近いうちに修正しなくっちゃ。

メモリの最適化

次は、メモリの最適化に取り組んでいきます。メモリ最適化なんだけど、何をするかというと、mallocの回数を減らすということと、gccがコードを最適化できるようにメモリ配置するということの二点。

mallocの回数を減らす

mallocは、遅いといわれている。遅いといっても、1秒間に100万回くらいは、実行できるようなんだけど、1秒間に1億回と比較すると、遅い感じね。

速くするためには、mallocで先に大きめのメモリを確保して、先頭から利用していくと速いといわれている。

まぁ、その、ベンチはとっていないけど、初期実装は、素直に定石に従おうという感じやね。

Perlの場合は、アリーナという領域があって、少し大きめのメモリを確保して、先頭から利用していって、足りなくなると倍に増やした領域を追加で確保という実装になっていた気がする。

SPVMの場合も、これと合わせようと思う。ちょうど、オブジェクトのヘッダーサイズのブロックを基準にして、その大きさの整数倍のメモリを確保する。そして、足りなくなったら拡張。メモリが解放されたら、フリーリストに追加して、再利用できるようにする。

こんな感じかな。

gccがコードを最適化できるようにメモリ配置する

SPVMは、一切の最適化をgccに任せている。SPVM自体での独自実装の、最適化はしんどい。僕がしんどい。倒れる。バグ混入のリスクが高そう。ひとりでは無理。

というわけで、開発方針として、gccがなるべく最適化しやすいC言語ソースコードを、出力しようということになっている。

具体的には、今は共用体で、すべてのデータを表現しているんだけど、int32_tのところは、すべてint32_t、doubleのところは、すべてdoubleとわかるように、型宣言するということやね。