はじめに
本記事では、Go言語とRustで同じ機能を持つWASMを書き、3つの観点で比較した
つくったもの
複数のファイルをZipアーカイブに変換しダウンロードする機能を持つWASMを、Go言語とRustで作成した
環境等
Mac Mini (M1)
Darwin root.local 23.1.0 Darwin Kernel Version 23.1.0: Mon Oct 9 21:28:12 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T8103 arm64
Go言語
go version go1.21.5 darwin/arm64
Rust
stable-aarch64-apple-darwin unchanged - rustc 1.74.1 (a28077b28 2023-12-04)
すうじをみる
コードサイズ
言語ファイル名サイズ(Byte)1Go言語main.go16622Rustlib.rs2169
Go言語がより小さいファイルサイズ。ただし差は 500Byte程度。
コードサイズ(または文字数)は書き方にも影響され、IDEの機能で長いコードを書くのも苦しくないという意見は存在すると思う。
しかし、改修や機能追加の際にはコードを読み・理解する必要があり、コードの長さは無視できない為、今回比較対象とした。
WASMサイズ
言語ファイル名サイズ(Byte)1Rustzip_archive_rust_wasm_bg.wasm1495542Go言語main.wasm2618952
Rustがより小さいファイルサイズ。桁が違う。ただしTinyGo未使用。
ビルドされたwasmファイルは、処理実行前にダウンロードされる。回線状況によってはユーザビリティに影響するため比較対象とした。
実行時間
言語平均実行時間(msec)1Go言語166.52Rust1846
Go言語がより短い実行時間。桁が違う。
計測方法は、1MByteのファイルを10個 入力として渡しZipアーカイブ完了までの時間を2回測り平均した。
処理開始と完了時にDate.now()でmsecを出力した。(リポジトリのindex.html参照)
ブラウザはChromeを使用した。
これは予想外で、同程度かRustが短い実行時間かと思っていた。
コードの書き方や計測方法にも影響されるが、今回はこの結果。
処理完了までの待ち時間として、ユーザビリティに影響するため比較対象とした。
おわりに
今回比較した観点以外にも、WASMを書く言語として以下の点を気にしていきたい
-
- 求める機能を実現できるライブラリが存在するか・そしてWASMで利用可能か
-
- 新規メンバーの習熟コストが高いか
- 改修や機能追加が容易か
謝辞
今回の記事を書くきっかけを与えられた
実践入門WebAssembly