2026-01-26
Wasm SIMD命令がおもしろかったので、もうちょっと実用的なキーワード検索に挑戦。

ブログ検索で使うことを想定し、下記のようなコードをWasm SIMD化してみます。

export class FindIndexes { static async create() { return new FindIndexes(); } setTexts(texts, cap = 1000) { this.texts = texts; this.cap = cap; } findIndexes(key) { const res = []; for (let i = 0; i < this.texts.length; i++) { if (this.texts[i].includes(key)) res.push(i); } return res; } }

1つの文字列化したブログ一覧などから、特定キーワードを含む記事のインデックスを配列で返します。

Wasm SIMD版がこちら「find_all.wat」ですが、6059件内の検索で5.32ms、JavaScript版の1.97msより遅い!あまり、Wasm SIMDが活かせない課題だったようです。

このままただの失敗ではおしいので、マルチスレッド化してみました。Workerをその環境で使える並列化数 navigator.hardwareConcurrency - 1 だけ生成し、並行して検索する、FindIndexes_threads.ts でテストしてみましたが、6000件程度ではオーバーヘッドの方が大きいようで、並列化での高速化は微妙。


「code4fukui/find-simd」

ソースはこちら。

特性に合った課題の設定が大事です。

links
- Wasm SIMDで立っているビットの数を数えるライブラリ、popcount-simd

クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS