はじめに
本記事では、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) | |
---|---|---|---|
1 | Go言語 | main.go | 1662 |
2 | Rust | lib.rs | 2169 |
Go言語がより小さいファイルサイズ。ただし差は 500Byte程度。
コードサイズ(または文字数)は書き方にも影響され、IDEの機能で長いコードを書くのも苦しくないという意見は存在すると思う。
しかし、改修や機能追加の際にはコードを読み・理解する必要があり、コードの長さは無視できない為、今回比較対象とした。
WASMサイズ
言語 | ファイル名 | サイズ(Byte) | |
---|---|---|---|
1 | Rust | zip_archive_rust_wasm_bg.wasm | 149554 |
2 | Go言語 | main.wasm | 2618952 |
Rustがより小さいファイルサイズ。桁が違う。ただしTinyGo未使用。
ビルドされたwasmファイルは、処理実行前にダウンロードされる。回線状況によってはユーザビリティに影響するため比較対象とした。
実行時間
言語 | 平均実行時間(msec) | |
---|---|---|
1 | Go言語 | 166.5 |
2 | Rust | 1846 |
Go言語がより短い実行時間。桁が違う。
計測方法は、1MByteのファイルを10個 入力として渡しZipアーカイブ完了までの時間を2回測り平均した。
処理開始と完了時にDate.now()
でmsecを出力した。(リポジトリのindex.html参照)
ブラウザはChromeを使用した。
これは予想外で、同程度かRustが短い実行時間かと思っていた。
コードの書き方や計測方法にも影響されるが、今回はこの結果。
処理完了までの待ち時間として、ユーザビリティに影響するため比較対象とした。
おわりに
今回比較した観点以外にも、WASMを書く言語として以下の点を気にしていきたい
- 求める機能を実現できるライブラリが存在するか・そしてWASMで利用可能か
- 新規メンバーの習熟コストが高いか
- 改修や機能追加が容易か
謝辞
今回の記事を書くきっかけを与えられた
実践入門WebAssembly