SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Rust言語で作るWebバイナリファイル「WebAssembly」入門

Rust/WebAssemblyのトラブルに効くデバッグ&高速化テクニック

Rust言語で作るWebバイナリファイル「WebAssembly」入門 第5回

  • X ポスト
  • このエントリーをはてなブックマークに追加

WebAssemblyのファイルサイズを縮小

 WebAssemblyのファイル(*.wasm)は、表示速度の面からファイルサイズがより小さいほうが望ましいです。本連載で利用してきた「wasm-pack build」コマンドは、デフォルトでリリース向けのビルドを行う(詳細は公式ドキュメント参照)ので、極端に余分なバイナリファイルは生成しませんが、設定次第でさらにファイルサイズを縮小できます。

最適化レベルの指定

 Cargo.tomlファイルには、リスト12の通り、デフォルトで最適化レベルが指定されています。「profile.release」への指定はリリース向け(relase)ビルドへの指定を表すので、「wasm-pack build」でのビルド時に、この最適化レベルが反映されます。

[リスト12]デフォルトで指定されている最適化レベルの記述(p001-logging/Cargo.toml)
[profile.release]
opt-level = "s"

 opt-lebelには、0(最適化なし)~3(すべての最適化を実施)、"s"(バイナリサイズを最適化)、"z"(さらにバイナリサイズを最適化)が指定できます。ただし、最適化の指定で逆にファイルサイズが大きくなる場合もあるため、実際にサイズを見ながら設定値を試す必要があります。今回のサンプルコード(p001-logging)では、opt-level = 3のときにバイナリファイルのファイルが最小になりました(詳細は後述)。

console_error_panic_hookを使わない

 p001-loggingサンプルで紹介したconsole_error_panic_hookは、パニックの詳細を表示できる反面、ファイルサイズを増やす原因となります。十分に動作確認が終わったアプリではconsole_error_panic_hookを無効にすることでファイルサイズを縮小できます。Cargo.tomlの「features」をリスト13の通り変更することで、console_error_panic_hookを無効にできます(当然ですが、パニックの詳細はログ出力されなくなります)。

[リスト13]console_error_panic_hookを無効に変更(p001-logging/Cargo.toml)
[features]
default = [] # もともと指定されている"console_error_panic_hook"を削除する

アロケーターを変更

 Rustで利用するアロケーター(メモリを確保する仕組み)を、WebAssemblyに最適化された「wee_alloc」に変更することでファイルサイズを縮小できます(それと引き換えに実行速度が落ちます)。Cargo.tomlの「features」をリスト14の通り変更します。

[リスト14]wee_allocアロケーターを有効に変更(p001-logging/Cargo.toml)
[features]
default = ["wee_alloc"]

 この設定により、lib.rsに記述されたリスト15の指定が有効となり、wee_allocが利用されるようになります。

[リスト15]wee_allocアロケーターを使用する実装(p001-logging/src/lib.rs)
#[cfg(feature = "wee_alloc")] // wee_allocがfeatureに設定されたときに有効
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

ファイルサイズ縮小の実例

 p001-loggingサンプルで、デフォルトから設定を変更していった場合のWebAssemblyファイルサイズを表1に示します。設定次第でファイルサイズを縮小できることがわかります。

表1 ビルド設定によるWebAssemblyファイルサイズの変化(p001-logging)
No. 条件 WebAssemblyのファイルサイズ
1 デフォルト状態 21,910バイト
2 No.1から最適化レベルを3に変更 21,152バイト
3 No.2からconsole_error_panic_hookを無効化 16,808バイト
4 No.3からwee_allocを有効化 10,853バイト

完成したプログラムを世界に公開して再利用

 Rust/WebAssemblyで作成したプログラムを世界に公開したいことがあるかもしれません。そうでなくても、自分でよく使うプログラムを公開しておけば、自分で再利用するときに便利です。以下では図5のサンプルで、Rust/WebAssemblyプログラムの公開と再利用について説明します。このサンプルはアップロードした画像をモノクロに変換するもので、詳細は第4回を参照してください。

図7 画像をモノクロに変換するサンプル(p003-image-processor)
図7 画像をモノクロに変換するサンプル(p003-image-processor)

 このプロジェクトのWebAssemblyを公開してみましょう。まず、wasm-packコマンドをnpmのアカウントと連携させるため「wasm-pack login」コマンドを実行します。

 コマンド実行時に表示されるURLを開くとログイン画面が表示されるので(図8)、npmのアカウントとパスワードでログインします。アカウントは無料で作成できます。

図8 wasm-pack loginコマンド実行時にWebブラウザーに表示されるログイン画面
図8 wasm-pack loginコマンド実行時にWebブラウザーに表示されるログイン画面

 次に、「wasm-pack build」コマンドでWebAssemblyをビルド後、「wasm-pack publish」コマンドを実行すると、WebAssemblyがnpmに公開されます。ただし、サンプルコードでそのまま実行すると「p003-image-processor」という名前が使用済みで公開できないため、Cargo.tomlでパッケージ名を変更してから実行してください(リスト16)

[リスト16]公開するパッケージ名を設定(p003-image-processor/Cargo.toml)
[package]
name = "p003-image-processor-xxxx" # ここを書き換えてパッケージ名を変更

 公開されたパッケージは通常のnpmパッケージ同様プロジェクトに導入できます。p004-use-image-processorのサンプルコードでは、package.jsonにリスト17の通り記述して、npm上に存在するp003-image-processorパッケージを追加しています。

[リスト17]公開されたパッケージを参照する指定(p004-use-image-processor/package.json)
"dependencies": {
  "p003-image-processor": "^0.1.0"
},

 「npm install」コマンドでp003-image-processorパッケージを導入後、「npm run start」コマンドを実行すると、元のp003-image-processor同様に、図7の通り実行できます。

まとめ

 本記事では、Rust/WebAssemblyのデバッグ時に必要なログ出力方法と、WebAssemblyのファイルサイズ縮小方法、パッケージ公開と利用方法を説明しました。各種ログや実行時間をコンソールに出力して、プログラムの動作状況を確認できます。WebAssemblyのサイズ縮小は、Webページの読み込み速度改善に役立ちます。作成したプログラムをパッケージとして公開することで、別なプロジェクトで部品として再利用できます。

 本連載では今回まで、Rust言語を利用したWebAssemblyの実装について紹介してきました。最近のWebブラウザーではJavaScriptが高速で動作するようになりましたが、それでも速度が足りない、もっと最適化したいというときに、WebAssemblyは有力な選択肢です。フロントエンドプログラムの幅を広げるWebAssemblyの世界に、Rust言語を武器に挑戦してみてはいかがでしょうか。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Rust言語で作るWebバイナリファイル「WebAssembly」入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト  吉川 英一(ヨシカワ エイイチ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17936 2023/07/11 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング