🧊

UIスレッドとWorkerスレッドで、コードの実行速度に差はあるのか

普通の処理をUIスレッドで実行するのと、いわゆるWorkerスレッドで実行するのでは、どっちが速いのか。

用途とかはあるやろうけど、単にどっちが速いのかふと気になったので調べた。

事の発端

いわゆる「しばらくお待ちください・・」的UIの裏側で行うような処理を、Workerで代替すれば早くなるのかが知りたかった。

UIスレッドからの介入が何もない場合に、裏で計算するとちょっとでも速くなったりしないかなーと。
もしくは、UIスレッドのほうがリソースが豊富で、何もしてないならUIスレッドでやるほうが速かったりするかなーとか。

ベンチマークには

Googleが作ったOctaneってやつを使ってみた。
いくつかの機能別の項目に分かれてて、それぞれのスコアがわかるようになってる。

処理の内容によって差がでることもある気はして、でもそれを手動のテストで調べるのは面倒くさかったので・・。

公式: Octane  |  Google Developers
GitHub: GitHub - chromium/octane: The JavaScript Benchmark Suite for the modern web

ココでブラウザからもすぐ試せる。

Octane 2.0 JavaScript Benchmark

というわけで

わかりやすい見た目も全てはぎとって、Consoleにスコアを吐くだけにしてみた。
そして、肝心のWorkerで動かすとどうなるのかも試せるようにした。

GitHub - leader22/octane-bench

結果

ためした環境は以下。

  • Max OS X 10.11.3
  • Chrome 49.0.2623.28 beta (64-bit)

それぞれ実行したらじっと待つ。
何回かやったうちの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回くらいしか見てないけど、もっと回数やればブレも少なくなりそうではある。
が、まぁだいたい一緒ということでそれ以上の興味ががなくなったので調査終了(˘ω˘ )

ちなみに各ベンチが何をやってるか詳しく知りたい場合は、以下からどうぞ。

The Benchmark  |  Octane  |  Google Developers

ただWorkerとはいえ並列で流しまくるとガンガンスコアが下がってくので、どれくらいWorkerに振るかとかは別途考えないといけない模様。