普通の処理をUIスレッドで実行するのと、いわゆるWorkerスレッドで実行するのでは、どっちが速いのか。
用途とかはあるやろうけど、単にどっちが速いのかふと気になったので調べた。
事の発端
いわゆる「しばらくお待ちください・・」的UIの裏側で行うような処理を、Workerで代替すれば早くなるのかが知りたかった。
UIスレッドからの介入が何もない場合に、裏で計算するとちょっとでも速くなったりしないかなーと。
もしくは、UIスレッドのほうがリソースが豊富で、何もしてないならUIスレッドでやるほうが速かったりするかなーとか。
ベンチマークには
Googleが作ったOctaneってやつを使ってみた。
いくつかの機能別の項目に分かれてて、それぞれのスコアがわかるようになってる。
処理の内容によって差がでることもある気はして、でもそれを手動のテストで調べるのは面倒くさかったので・・。
公式: Octane | Google Developers
GitHub: GitHub - chromium/octane: The JavaScript Benchmark Suite for the modern web
ココでブラウザからもすぐ試せる。
というわけで
わかりやすい見た目も全てはぎとって、Consoleにスコアを吐くだけにしてみた。
そして、肝心のWorkerで動かすとどうなるのかも試せるようにした。
結果
ためした環境は以下。
それぞれ実行したらじっと待つ。
何回かやったうちの1回の結果がコレ。
testName | UIScore | WorkerScore | UI / Worker |
---|---|---|---|
Richards | 30257 | 29943 | 1.0104865911899275 |
DeltaBlue | 42805 | 52657 | 0.8129023681561806 |
Crypto | 27078 | 25817 | 1.0488437851028392 |
RayTrace | 64083 | 60753 | 1.0548121080440471 |
EarleyBoyer | 29398 | 31958 | 0.9198948620063834 |
RegExp | 2930 | 4866 | 0.6021372790793259 |
Splay | 15390 | 8125 | 1.894153846153846 |
SplayLatency | 20561 | 15649 | 1.3138858713016806 |
NavierStokes | 30657 | 30035 | 1.0207091726319295 |
PdfJS | 17746 | 17798 | 0.9970783234071244 |
Mandreel | 21794 | 24161 | 0.9020322006539464 |
MandreelLatency | 46591 | 49852 | 0.9345863756719891 |
Gameboy | 44380 | 53650 | 0.8272134203168686 |
CodeLoad | 10607 | 9736 | 1.0894617912900575 |
Box2D | 41832 | 47618 | 0.8784913268091898 |
zlib | 51488 | 54518 | 0.9444220257529623 |
Typescript | 31251 | 29413 | 1.0624893754462312 |
Total | 25915 | 26156 | 0.990786053 |
数値はBigger is Betterだそうです。
何回かやってると回ごとにすごい差がついたりするところもある・・けど、だいたい一緒って感じ・・?
割と時間がかかるから10回くらいしか見てないけど、もっと回数やればブレも少なくなりそうではある。
が、まぁだいたい一緒ということでそれ以上の興味ががなくなったので調査終了(˘ω˘ )
ちなみに各ベンチが何をやってるか詳しく知りたい場合は、以下からどうぞ。
ただWorkerとはいえ並列で流しまくるとガンガンスコアが下がってくので、どれくらいWorkerに振るかとかは別途考えないといけない模様。