Assemblyすべきか否かいつもよりもぐっとテクニカルな話。閲覧に励まれていると思われます。(もしかしたら、若い人はもうブラウザほとんど使わないのかもしれませんが)。そのブラウザで走る言語といえばJavascriptで、現代においてちょっとした計算をブラウザの中でやろうとしたら、これ一択でしょう。ブラウザに充てられる莫大な投資によって、そのJavascriptなる言語を走らせるインタープリタの性能はは年々上がり数年前に比べて目覚ましい進歩を遂げています。いえ、所詮インタープリタ言語であり、c++や今回使うrustのそれと比べると遅いという印象は一般に言えると思います。そこで近年、もっと機械に近いコードを直接Javascriptのエンジンに渡し、さらにスピードをあげようという試みが注目されています。その名もWebAssembly(通称wasm)。互換なバイナリをコンパイルし、それをjavascriptから呼び出すというプロセスになります。今回はそれを少し試す機会があったのでその紹介です。目的はJSONオブジェクトのハッシュ値(sha256)を求め、conole.log()する簡単なものです。https://github.com/yasushisakai/json-hasher-wasm流れとしては、任意のオブジェクトをシリアライズして、得られた文字列をハッシュする事です。説明することもないのですが、ハッシュを計算する以外に、一つだけ気に止める事は、オブジェクトだった場合(key,valueペアのデータ)にそのキーの順番をソートする必要がある事です。これによって、入力のオブジェクトを揃えることができるので安心してハッシュできます。Javascriptが嫌いかを体現しています。やるなら、Typescriptで書いて、最適化するんでしょうが、時間がなくてばっとやるという想定です。npmで適当に探した人気のハッシュライブラリなので、そこも時短しております。Rustはまだまだマイナーだけど開発者の中で4年連続でももっとも愛されている言語で、鬼畜コンパイラーによって鍛えられる(?)新しい言語です。Rustの変態性についてはいつかにとっておいて、上のJSのコードをRustで書くとこんな感じ。}}で、肝心のsha256はこちらにて自炊しております。上のhash_jsonがjavascript側からアクセスする関数になります。Rustで書かれた物をwasmにコンパイルする方法はこちらにすごく綺麗にまとまっています。ちなみに今回のテストではこの方法で得られた.wasmファイルをさらにbinaryenなるツールで軽量化・高速化しております。2.4ざっと10倍早くなりました。