L@iw4x,X K"Y^ҚTy"a"*z0uN(x`X@'P^a3t0`sH}p2{XT<;EQ'Ph3ӳ4 Y ϧdbodyy Wasm(WebAssembly)にも、CPUの並列計算命令SIMD(シムド、Single Instruction, Multiple Data)に対応した、Wasm SIMDがあり、標準的な環境で使えるようになっています。

テストも兼ねて、8bitを16コ束ねた128bitで処理できる命令のひとつ、ビットの数を数えるSIMD命令 i8x16.popcnt を使って、任意のデータから立っているビットの数を返すライブラリを作ってJavaScript実装と速度比較してみました。


100byteから10億byteまでのランダムなデータを使ったビットカウントを比較したグラフです。横軸はデータ量、縦軸は計算時間ですが、SIMDでJS版の約4倍速いという結果になりました。

10kbyteでもSIMD0.1秒に対して、JS0.4秒とオーバーヘッドも少ないので使いやすいです。


「code4fukui/popcount-simd」

WebAssemblyによるカウントプログラム popcnt16.wat と、JavaScriptによる実装。比較してみるのもおもしろいです。

const POPCNT8 = (() =&gt; { const t = new Uint8Array(256); for (let i = 0; i &lt; 256; i++) { let x = i, c = 0; while (x) { x &amp;= x - 1; c++; } t[i] = c; } return t; })(); export const popcount = (data) =&gt; { let sum = 0; const t = POPCNT8; for (let i = 0; i &lt; data.length; i++) { sum += t[data[i]]; } return sum; };

WebAssembly(WASM)は、IchigoJam web でも活躍しています! ddates2026-01-25T23:55:00bidDcimgxKhttps://img.sabae.cc/data/20260126/13d3d935-e85b-4fd9-8222-fce6ad653b25.jpgdtagsi#wasm #jsetitlexUWasm SIMDで立っているビットの数を数えるライブラリ、popcount-simdcurlxhttps://fukuno.jig.jp/4932