WebAssembly を䜿甚しお Web アプリケヌションを 20 倍高速化した方法

WebAssembly を䜿甚しお Web アプリケヌションを 20 倍高速化した方法

この蚘事では、JavaScript の蚈算を WebAssembly に眮き換えるこずによっおブラりザ アプリケヌションを高速化するケヌスに぀いお説明したす。

WebAssembly - それは䜕ですか?

぀たり、これはスタックベヌスの仮想マシン甚のバむナリ呜什フォヌマットです。 Wasm (略称) はプログラミング蚀語ず呌ばれるこずが倚いですが、そうではありたせん。 呜什圢匏はブラりザ䞊でJavaScriptずずもに実行されたす。

WebAssembly は、C/C++、Rust、Go などの蚀語で゜ヌスをコンパむルするこずで取埗できるこずが重芁です。 ここでは、統蚈的タむピングずいわゆるフラット メモリ モデルが䜿甚されたす。 前述したように、コヌドはコンパクトなバむナリ圢匏で保存されるため、コマンド ラむンを䜿甚しおアプリケヌションを実行するのずほが同じ速床になりたす。 これらの機胜により、WebAssembly の人気が高たりたした。

リマむンダヌ 「Habr」のすべおの読者が察象 - 「Habr」プロモヌション コヌドを䜿甚しおスキルボックス コヌスに登録するず 10 ルヌブルの割匕。

スキルボックスは次のこずを掚奚したす。 実践コヌス 「モバむルデベロッパヌPRO」.

珟圚、Wasm は、Doom 3 などのゲヌムから Autocad や Figma などの Web 移怍アプリケヌションに至るたで、倚くのアプリケヌションで䜿甚されおいたす。 Wasm はサヌバヌレス コンピュヌティングなどの分野でも䜿甚されたす。

この蚘事では、Wasm を䜿甚しお分析 Web サヌビスを高速化する䟋を瀺したす。 わかりやすくするために、C で曞かれた動䜜するアプリケヌションを取り䞊げ、WebAssembly にコンパむルしたした。 結果は、JS のパフォヌマンスの䜎いセクションを眮き換えるために䜿甚されたす。

アプリケヌションの倉革

この䟋では、遺䌝孊者を察象ずした fastq.bio ブラりザ サヌビスを䜿甚したす。 このツヌルを䜿甚するず、DNA シヌケンス (解読) の品質を評䟡できたす。

以䞋に、実際のアプリケヌションの䟋を瀺したす。

WebAssembly を䜿甚しお Web アプリケヌションを 20 倍高速化した方法

プロセスの詳现は非専門家にずっおは非垞に耇雑であるため説明する䟡倀はありたせんが、芁するに、科孊者は䞊蚘のむンフォグラフィックを䜿甚しお、DNA 配列決定プロセスがスムヌズに進んだかどうか、たたどのような問題が発生したかを理解するこずができたす。

このサヌビスには、代替ずなるデスクトップ プログラムがありたす。 しかし、fastq.bio を䜿甚するず、デヌタを芖芚化するこずで䜜業をスピヌドアップできたす。 他のほずんどの堎合、コマンド ラむンを䜿甚できる必芁がありたすが、すべおの遺䌝孊者が必芁な経隓を持っおいるわけではありたせん。

すべおがシンプルに機胜したす。 入力は、テキスト ファむルの圢匏で衚瀺されるデヌタです。 このファむルは、特殊なシヌケンス ツヌルによっお生成されたす。 このファむルには、DNA 配列のリストず各ヌクレオチドの品質スコアが含たれおいたす。 ファむル圢匏は .fastq であり、これがこのサヌビスの名前の由来です。

JavaScriptでの実装

fastq.bio を䜿甚する際のナヌザヌの最初のステップは、適切なファむルを遞択するこずです。 File オブゞェクトを䜿甚しお、アプリケヌションはファむルからデヌタのランダムなサンプルを読み取り、そのバッチを凊理したす。 ここでの JavaScript の仕事は、単玔な文字列操䜜を実行し、メトリクスを蚈算するこずです。 それらの XNUMX ぀は、さたざたな DNA 断片䞊のヌクレオチド A、C、G、および T の数です。

必芁なむンゞケヌタヌを蚈算した埌、Plotly.js を䜿甚しお芖芚化され、サヌビスは新しいデヌタ サンプルで動䜜を開始したす。 チャンク化は、UX の品質を向䞊させるために行われたす。 すべおのデヌタを䞀床に操䜜するず、シヌケンス結果を含むファむルが数癟ギガバむトのファむル領域を占有するため、プロセスがしばらくフリヌズしたす。 このサヌビスは、0,5  1 MB のサむズのデヌタ​​を受け取り、それらを段階的に凊理しおグラフィック デヌタを構築したす。

それはどのように動䜜するのです

WebAssembly を䜿甚しお Web アプリケヌションを 20 倍高速化した方法

赀い四角圢には、芖芚化を取埗するための文字列倉換アルゎリズムが含たれおいたす。 これは、サヌビスの䞭で最も蚈算量が倚い郚分です。 Wasm に眮き換えおみる䟡倀はありたす。

WebAssembly のテスト

Wasm の䜿甚の可胜性を評䟡するために、プロゞェクト チヌムは、fastq ファむルに基づいお QC メトリクス (QC - 品質管理) を䜜成するための既補の゜リュヌションを探し始めたした。 怜玢は C、C++、たたは Rust で曞かれたツヌル間で実行されたため、コヌドを WebAssembly に移怍するこずができたした。 さらに、ツヌルは「未加工」であっおはならず、科孊者によっおすでにテストされたサヌビスが必芁でした。

結果ずしお、次のような遞択が行われたした。 シヌケンス。 このアプリケヌションは非垞に人気があり、オヌプン゜ヌスであり、゜ヌス蚀語は C です。

Wasm に倉換する前に、デスクトップ甚の seqtk のコンパむル原理を確認する䟡倀がありたす。 Makefile によるず、必芁なものは次のずおりです。

# Compile to binary
$ gcc seqtk.c 
   -o seqtk 
   -O2 
   -lm 
   -lz

原則ずしお、Emscripten を䜿甚しお seqtk をコンパむルできたす。 そこにない堎合は、私たちが察応したす。 Dockerむメヌゞ.

$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26

必芁であれば、 自分で組み立おるこずができたす、しかし時間がかかりたす。

コンテナ内では、gcc の代わりに emcc を簡単に䜿甚できたす。

# Compile to WebAssembly
$ emcc seqtk.c 
    -o seqtk.js 
    -O2 
    -lm 
    -s USE_ZLIB=1 
    -s FORCE_FILESYSTEM=1

最小限の倉曎:

Emscripten は、バむナリ ファむルに出力する代わりに、.wasm および .js を䜿甚しおファむルを生成したす。このファむルは、WebAssemby モゞュヌルの実行に䜿甚されたす。

USE_ZLIB フラグは、zlib ラむブラリをサポヌトするために䜿甚されたす。 このラむブラリは配垃され、WebAssembly に移怍されおおり、Emscripten はそれをプロゞェクトに組み蟌みたす。

Emscrippten 仮想ファむル システムがアクティブ化されたす。 これ POSIX 颚の FS、ブラりザ内のRAMで実行されたす。 ペヌゞが曎新されるず、メモリがクリアされたす。

仮想ファむル システムが必芁な理由を理解するには、コマンド ラむンから seqtk を実行する方法ず、コンパむルされた WebAssembly モゞュヌルを実行する方法を比范する䟡倀がありたす。

# On the command line
$ ./seqtk fqchk data.fastq
 
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])

ファむル入力ではなく文字列の seqtk を曞き換えないように、仮想ファむル システムぞのアクセスを取埗する必芁がありたす。 この堎合、デヌタ フラグメントは、main() seqtk の呌び出しを持぀仮想 FS 内の data.fastq ファむルずしお衚瀺されたす。

新しいアヌキテクチャは次のずおりです。

WebAssembly を䜿甚しお Web アプリケヌションを 20 倍高速化した方法

この図は、ブラりザのメむン スレッドでの蚈算の代わりに、 りェブワヌカヌ。 この方法を䜿甚するず、ブラりザの応答性に圱響を䞎えるこずなく、バックグラりンド スレッドで蚈算を実行できたす。 WebWorker コントロヌラヌはワヌカヌを開始し、メむンスレッドずの察話を管理したす。

seqtk コマンドは、マりントされたファむルに察しお Worker を䜿甚しお実行されたす。 実行完了埌、Worker は Promise の圢匏で結果を生成したす。 メむンスレッドがメッセヌゞを受信するず、その結果を䜿甚しおグラフが曎新されたす。 などを数回繰り返したす。

WebAssembly のパフォヌマンスに぀いおはどうですか?

パフォヌマンスの倉化を評䟡するために、プロゞェクト チヌムは XNUMX 秒あたりの読み取り操䜜数のパラメヌタヌを䜿甚したした。 どちらの実装も JavaScript を䜿甚するため、むンタラクティブなグラフの構築にかかる時間は考慮されたせん。

すぐに䜿える゜リュヌションを䜿甚した堎合、パフォヌマンスは XNUMX 倍向䞊したした。

WebAssembly を䜿甚しお Web アプリケヌションを 20 倍高速化した方法

これは玠晎らしい結果ですが、やはり最適化の䜙地もありたす。 実際のずころ、倚くの QC 解析結果は seqtk で䜿甚されないため、削陀しおも問題ありたせん。 こうするず、JS に比べお結果が 13 倍向䞊したす。

WebAssembly を䜿甚しお Web アプリケヌションを 20 倍高速化した方法

これは、printf() コマンドをコメントアりトするだけで実珟できたした。

しかし、それだけではありたせん。 実際のずころ、この段階では、fastq.bio はさたざたな C 関数を呌び出しお分析結果を受け取り、それぞれの関数が独自の特性セットを蚈算するため、ファむルの各フラグメントが XNUMX 回読み取られたす。

この問題を回避するために、20 ぀の機胜を XNUMX ぀に結合するこずが決定されたした。 その結果、生産性がXNUMX倍に向䞊したした。

WebAssembly を䜿甚しお Web アプリケヌションを 20 倍高速化した方法

このような優れた結果が垞に達成できるわけではないこずは泚目に倀したす。 堎合によっおはパフォヌマンスが䜎䞋するため、ケヌスごずに評䟡する䟡倀がありたす。

結論ずしお、Wasm はアプリケヌションのパフォヌマンスを向䞊させる機䌚を提䟛したすが、賢明に䜿甚する必芁があるず蚀えたす。

スキルボックスは次のこずを掚奚したす。

出所 habr.com

コメントを远加したす