WebAssembly/バイナリをコンパクトにする
wasm-packのプロジェクトテンプレートを雛形に新しくプロジェクトを起こしました。どう開発を進めていくのがいいのかなと考えながら、既存のコ-ドを眺めていると動的ライブラリのメインスクリプトであるlib.rsファイルに真っ先に書いてある三行が目につきます。
#[cfg(feature = "wee_alloc")] #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
不要なら消してもいいらしいですが、わざわざテンプレートに書いてあるってことは多くのケースで有用な記述であると思われます。謎のwee_allocの登場にさっそく足が止まってしまいましたが、ちょっとだけこれが何なのか調べてみました。
そもそもallocatorってなんだよってところからなのですが、ヒープメモリの利用領域を確保してくれる役割のことを指すようです。C言語のmallocとかが綴りからも仲間であることがよくわかります。最後に動的にメモリを確保したのはいつのことでしょうね。勝手にその辺をよろしくやってくれる高級言語ばかり触ることが多かったので意識の外側に追いやられていましたが、アロケーターは大事な子です。プログラムの動作スピードにも定評のあるRustではもちろんアロケーターの選別が効率に関わってくるのでしょう。どうやらglobal_allocatorなるものにwee_alloc::WeeAllocを指定しているようですね。
wee_alloc::WeeAllocは機能としては品質が下がるもののバイナリコードのサイズが随分と少なくなるのだそうです。weeは「小さい」を意味する単語ということでいいかな?WebAssemblyはwasmファイルのサイズが大きいとやはりそれに応じてオーバーヘッドが大きくなるらしくて、wee_alloc::WeeAllocを使用した方が全体的なパフォーマンスが上がることが多いみたいです。もちろん実装内容によって一概には言えないと思うので、開発が進むにつれて再検討が相応しくなってくる局面もあるのでしょう。現時点では、何とも言えないのでとりあえずwee_alloc::WeeAllocを利用してみることにしました。
これに限らずWebAssemblyではバイナリファイルのサイズを抑える方法をいろいろ考えられているようです。今後、使えそうな技があったらここに書き加えていこうと思います。