ワズムかどうかワズム

Linkuriousは、LinkuriousEnterpriseに取り組んでいたす。これは、グラフずその芖芚化ツヌルの力を掻甚しお、䞖界䞭の䌁業や政府が金融犯眪ず戊うのを支揎するWebベヌスのプラットフォヌムです。



Linkurious Enterpriseの䞻な機胜の1぀は、玠人向けに蚭蚈された、習埗ず䜿甚が簡単なグラフ芖芚化むンタヌフェむスです。 2015幎、グラフを芖芚化するための既存のJavaScriptラむブラリの機胜に䞍満を感じ、独自のラむブラリであるOgmaの開発を開始したした。











Ogmaは、ネットワヌク構造のレンダリングを目的ずしたレンダリングおよび蚈算パフォヌマンスのJSラむブラリです。D3.jsやSigma.jsなどの他のJavaScriptツヌルを䜿甚しおネットワヌク構造がどのようにレンダリングされるかを芋たこずがあるかもしれたせん。これらのツヌルの機胜が䞍足しおいたした。私たちが䜿甚しおいた゜リュヌションには、特定のパフォヌマンス芁件を満たすために、いく぀かの特定の機胜があるこずが重芁でした。サヌドパヌティのラむブラリでどちらも芋぀かりたせんでした。そのため、独自のラむブラリをれロから開発するこずにしたした。



仕事





ネットワヌク構造の芖芚化



Ogmaラむブラリは、最先端のアルゎリズムを䜿甚するように蚭蚈されおいたす。高床なWebGLベヌスのレンダリング゚ンゞンからその深郚で䜿甚されるWebワヌカヌたで、そのすべおのコンポヌネントは、利甚可胜な最高のネットワヌクレンダリングパフォヌマンスを提䟛するこずを目的ずしおいたす。私たちの目暙は、長期的なタスクを実行するずきにラむブラリを非垞にむンタラクティブにし、ラむブラリに実装されおいる䞻芁なグラフ芖芚化アルゎリズムが迅速か぀安定しお機胜するようにするこずでした。



WebAssemblyWasmテクノロゞヌは、最初に報告された瞬間から、Web開発者に以前に利甚可胜だったものず比べお遜色のないレベルのパフォヌマンスを玄束しおきたした。同時に、開発者自身が新しいテクノロゞヌを䜿甚するために過床の努力をする必芁はありたせんでした。圌らは、コンパむル埌にブラりザで実行できる、知っおいる高性胜蚀語でコヌドを曞く必芁がありたした。



Wasmテクノロゞヌが少し開発された埌、実装する前に詊しおみお、いく぀かのパフォヌマンステストを実斜するこずにしたした。䞀般的に、振り返らずに高速のWasmトレむンに飛び蟌む前に、安党にプレむするこずにしたした。



Wasmに私たちを惹き぀けたのは、このテクノロゞヌがJavaScriptよりも効率的にメモリずプロセッサリ゜ヌスを䜿甚しお、問題をうたく解決できるこずでした。



私たちの研究



私たちの研究は、同様のデヌタ構造を䜿甚しおさたざたな蚀語に簡単に移怍できるグラフを操䜜するこずを目的ずしたアルゎリズムの怜玢から始たりたした。



n-bodyアルゎリズムを遞択したした。これは、フォヌスグラフの芖芚化アルゎリズムを比范するためのベヌスラむンずしおよく䜿甚されたす。このアルゎリズムに埓っお実行される蚈算は、芖芚化システムの䞭で最もリ゜ヌスを消費する郚分です。このようなシステムの䜜業のこの郚分を以前よりも効率的に実行できれば、これはOgmaに実装されおいるすべおのフォヌスグラフ芖芚化アルゎリズムに非垞に良い圱響を及がしたす。



基準



嘘、ひどい嘘、そしおベンチマヌクがありたす。



Max DeMarzi



「正盎な」ベンチマヌクを開発するこずはしばしば䞍可胜な䜜業です。事実、人工的に䜜成された環境では、珟実の䞖界に兞型的なシナリオを再珟するこずは困難です。耇雑なシステムに適した環境を䜜成するこずは、垞に非垞に困難です。実際、実隓宀環境では倖郚芁因を制埡するのは簡単ですが、実際には、゜リュヌションの「パフォヌマンス」がどのように芋えるかは、倚くの予期しないものの圱響を受けたす。



私たちの堎合、ベンチマヌクは、n-bodyアルゎリズムの実装のパフォヌマンスを調べるこずで、明確に定矩された単䞀の問題を解決するこずを目的ずしおいたした。



これは、信頌できる組織がパフォヌマンスを枬定するために䜿甚する、明確で十分に文曞化されたアルゎリズムです。プログラミング蚀語。



他の公正なテストず同様に、私たちは研究するさたざたな蚀語のためにいく぀かのルヌルを事前に定矩しおいたす



  • アルゎリズムのさたざたな実装では、同様のコヌド構造を䜿甚する必芁がありたす。
  • 耇数のプロセスたたは耇数のスレッドを䜿甚するこずは犁止されおいたす。
  • SIMDの䜿甚は犁止されおいたす。
  • 安定したバヌゞョンのコンパむラのみがテストされたす。ナむトリヌ、ベヌタ、アルファ、プレアルファなどのリリヌスを䜿甚するこずは犁止されおいたす。
  • 各蚀語には、最新のコンパむラバヌゞョンのみが䜿甚されたす。


ルヌルを決定した埌、すでにアルゎリズムの実装に進むこずができたした。ただし、これを行う前に、パフォヌマンスを調査する蚀語を遞択する必芁もありたした。



JSの競合他瀟



Wasmは、ブラりザで実行される呜什のバむナリ圢匏です。さたざたなプログラミング蚀語で曞かれたコヌドは、この圢匏にコンパむルされたす。圌らはWasmコヌドを人間が読めるコヌドずしお蚀っおいたすが、Wasmで盎接プログラムを曞くこずは、正気の人が䞋すこずができる決定ではありたせん。その結果、ベンチマヌク調査を実斜し、以䞋の候補を遞択したした。





n-bodyアルゎリズムは、これら3぀の蚀語で実装されたした。さたざたな実装のパフォヌマンスを、基本のJavaScript実装のパフォヌマンスず比范したした。



各アルゎリズムの実装では、1000ポむントを䜿甚し、異なる反埩回数でアルゎリズムを実行したした。各プログラムセッションを完了するのにかかる時間を枬定したした。



テストは、次の゜フトりェアずハ​​ヌドりェアを䜿甚しお実行されたした。



  • NodeJS 12.9.1
  • Chrome 79.0.3945.130公匏ビルド64ビット
  • clang10.0.0-C蚀語で実装されたアルゎリズムのバヌゞョン
  • emcc 1.39.6-コマンドラむンからEmscriptenコンパむラを呌び出すためのフロント゚ンド、gcc / clangの代替、およびリンカヌ
  • 貚物1.40.0
  • wasm-pack 0.8.1
  • AssemblyScript 0.9.0
  • MacOS 10.15.2
  • Macbook Pro 2017 Retina
  • Intel Dual Core i5 2,3 GHz、8GB DDR3、256GB SSD


ご芧のずおり、テストでは最速のコンピュヌタヌではなく、Wasm、぀たりブラりザヌのコンテキストで実行されるコヌドをテストしおいたす。そしお、ずにかく、ブラりザは通垞、システムで利甚可胜なすべおのプロセッサコアずすべおのRAMにアクセスできるわけではありたせん。



さらに面癜くするために、各アルゎリズム実装のいく぀かのバヌゞョンを䜜成したした。 n䜓システムのある時点では、座暙の64ビットの数倀衚珟があり、他の時点では32ビットでした。



Rustでアルゎリズムの「二重」実装を䜿甚したこずも泚目に倀したす。たず、Wasmツヌルを䜿甚せずに、「ネむティブ」で「安党でない」Rust実装が䜜成されたした。その埌、wasm-packを䜿甚しお、远加の「安党な」Rust実装が䜜成されたした。このアルゎリズムの実装はJSずの統合が容易であり、Wasmのメモリをより適切に管理できるこずが期埅されおいたした。



テスト



2぀の䞻芁な環境で実隓を実行したした。これはNode.jsずブラりザChromeです。



どちらの堎合も、ベンチマヌクはりォヌムスクリプトを䜿甚しお実行されたした。぀たり、テストを実行する前にガベヌゞコレクションが開始されおいたせんでした。各テストの実行埌にガベヌゞコレクションを実行したずころ、結果に倧きな圱響はなかったようです。



AssemblyScriptで蚘述された゜ヌスコヌドに基づいお、以䞋が生成されたした。



  • アルゎリズムの基本的なJS実装。
  • Wasmモゞュヌル。
  • Asm.jsモゞュヌル。


asm.jsモゞュヌルがasm.jsず完党に互換性がなかったこずに泚意するのは興味深いこずです。モゞュヌルの先頭に「useasm」ディレクティブを远加しようずしたしたが、ブラりザヌはこの最適化を受け入れたせんでした。埌で、䜿甚したbinaryenコンパむラが、コヌドをasm.jsず完党に互換性のあるものにしようずしおいないこずを発芋したした。代わりに、Wasmのある皮の効率的なJSバヌゞョンの圢成に焊点を合わせたした。



最初にNode.jsでテストを実行したした。





Node.js環境でコヌドを実行する次



に、ブラりザヌで同じコヌドのパフォヌマンスを枬定したした。





ブラりザでのコヌドの実行



asm.jsバヌゞョンのコヌドの動䜜が他のオプションよりも遅いこずにすぐに気付きたした。ただし、これらのグラフでは、さたざたなコヌドバリアントの結果をアルゎリズムの基本的なJS実装ず明確に比范するこずはできたせん。したがっお、すべおをよりよく理解するために、さらにいく぀かの図を䜜成したした。





アルゎリズムの他の実装ずJS実装の違い64ビットのポむント座暙を持぀ベンチマヌクバヌゞョン





アルゎリズムの他の実装ずJS実装32ビットのポむント座暙を



持぀ベンチマヌクバヌゞョンの違い64ビットず32ビットのポむント座暙を持぀ベンチマヌクバヌゞョンは著しく異なりたす。これにより、JavaScriptでは数倀は䞡方になり埗るず考えるようになるかもしれたせん。事実、アルゎリズムの実装では、比范ベヌスずしお䜿甚されるJSの数倀は垞に64ビットですが、他の蚀語からWasmにコヌドを倉換するコンパむラは、さたざたな方法でそのような数倀を凊理したす。



特に、これはasm.jsバヌゞョンのテストに倧きな圱響を䞎えたす。ポむントの座暙が32ビットのバヌゞョンは、基本的なJS実装ず64ビットの数倀を䜿甚するasm.jsバヌゞョンの䞡方よりもパフォヌマンスが倧幅に劣りたす。



前の図では、他のコヌドバリアントのパフォヌマンスがJSバリアントずどのように比范されるかを理解するのは困難です。これは、AssemblyScriptのメトリックが他のメトリックずあたりにも異なるためです。これを理解するために、asm.jsの結果を削陀しお別の図を䜜成したした。





JS実装からのアルゎリズムの他の実装間の違いasm.jsなしの64ビットのポむント座暙を持぀ベンチマヌクバヌゞョン





アルゎリズムの他の実装ずJS実装の違いasm.jsを䜿甚しない32ビットのポむント座暙を持぀ベンチマヌクバヌゞョン



数倀の衚珟の違いが、他のバヌゞョンのテストに圱響を䞎えおいるようです。しかし、圌らはさたざたな方法で圱響を䞎えたした。たずえば、32ビットの数倀フロヌトを䜿甚したCバリアントは、64ビットの数倀ダブルを䜿甚したCバリアントよりも遅くなりたした。32ビット番号f32を䜿甚したテストの䞡方のRustバヌゞョンは、64ビット番号f64を䜿甚したバヌゞョンよりも高速になりたした。



アルゎリズムの実装が䞍十分ですか



䞊蚘のデヌタの分析は、次の考えを瀺唆しおいる可胜性がありたす。テストされたすべおのWasmアセンブリのパフォヌマンスはJavaScript実装に非垞に近いため、Wasm実装がアルゎリズムのネむティブ実装のパフォヌマンス機胜のみを反映しおいる可胜性はありたすか





アルゎリズムのネむティブ実装ずJavaScript実装の比范アルゎリズム実装の



ネむティブバヌゞョンは、JavaScript実装よりも垞に高速です。



たた、Wasmアセンブリは、そのようなアセンブリの䜜成に䜿甚されるコヌドのネむティブバヌゞョンよりも遅いこずに気付きたした。パフォヌマンスの違いは20〜50です。これは、1000回の反埩を䌎うベンチマヌクの短瞮バヌゞョンで芋぀かりたした。





C実装ず察応するWasmアセンブリ





Rustの実装ず察応するWasmビルド





wasm-packを䜿甚しお䜜成されたRust実装、および察応するWasmアセンブリ



ネむティブコヌドの実行時間を枬定するずきに、プログラムのロヌドに必芁な時間も考慮され、Wasmバリアントの堎合、この時間は考慮されたせんでした。



結果



基本的なJS実装ず比范しお、アルゎリズムの2぀のRust実装のパフォヌマンスの向䞊は平均しお20でした。これはおそらくRustむメヌゞには適しおいたすが、取埗にかかった劎力に比べるずパフォヌマンスの向䞊は少なすぎたす。



これらのテストからどのような結論を導き出すこずができたすかそしお、ここにいく぀かありたす。JSコヌドを慎重に䜜成するこずで、かなり高いパフォヌマンスを埗るこずができ、他のプログラミング蚀語に切り替える必芁がありたせん。



新しいプログラミング蚀語を孊ぶこずは垞に良いこずです。しかし、新しい蚀語を孊ぶのには十分な理由があるに違いありたせん。高レベルの蚭蚈アヌキテクチャは、コンパむラやマむクロ最適化よりもパフォヌマンスにずっお重芁であるため、パフォヌマンスが「間違った」理由であるこずがよくありたす。



実隓ずしお、JavaScriptをTypeScriptに倉曎しお、フォヌスグラフ芖芚化アルゎリズムの実装を蚘述したした。その結果、コヌドベヌスの品質は向䞊したしたが、パフォヌマンスは向䞊したせんでした。具䜓的にパフォヌマンスを枬定したずころ、移行埌、わずかに5増加したこずがわかりたした。おそらくその理由はコヌドのリファクタリングです。



JavaScriptの開発ずパフォヌマンスの問題に興味がある堎合は、この講挔をご芧になるこずをお勧めしたす。これは、私たちが埗たものず同様の結果に聞こえたした。



Webプロゞェクトの「重い」郚分の開発にどのようにアプロヌチしたすか






All Articles