素数をWeb Workersを作って計算してみた(Javascriptサンプル)
"Web Wrokersを使ってマルチコアを使い尽くしてみた(Javascriptサンプル)"があまりにもシンプル過ぎたため、素数をWeb Workersを使った計算してみました。計算式はエラトステネスの篩で行いました。
ソースはソース置き場のprimenumbercheck.zipになります。webworkers_primenum.htmlをFirefox 3.6、Safari 4、Chrome 4.1で開いてください。
ここでthreadに-1を入れるとWeb Workersを使わずに計算されます。"0"の場合はsetTimeoutを使って擬似スレッドぽっく動かしていますが、あまり早くありません。
3つのブラウザをスレッドを変更することで計算の時間がどこまで短縮できるか調べました。ハードはPhenom II X4 940BE(3.0GHz)です。
■素数計算
ここで、円周率(モンテカルロシミュレーション)で求めたものは以下になります。
■円周率
あまりにも特性が違いすぎています。円周率の計算のほうは、最初にループ回数を渡してその結果をもらうようにしています。このため、本体とWeb Workersの間のやり取りが、各スレッドで1回で済んでいます。
ですが、素数の計算のほうは、各スレッドにチェックしたい数字を渡してその結果をもらっています。本体とWeb Workersの間やり取りは素数計算をしたい数だけ行います。作り的に以下になります。
このため非常に多くのスレッドとやり取りすることにしました。threadに-1を入れて計算させると100,000でも56ms程度しかかかりません。このため、スレッド間のMessage処理のオーバーヘッドがあるのではないかと推測しています。
また、SafariとChromeではJavascriptエンジンとしては後者の方が優れていると思います(円周率やJavascriptベンチ結果より)が、この素数計算のスクリプトではSafariの方が早く且つコア数とスレッド数が同じときの値の伸びが良くなっています。推測でしかありませんが、Safari系はMessage関係の処理がChromeよりも良いのではないかと思っています。これは、Chromeのbeta/devやChromiumが、円周率のWeb Workersのサンプルが動かないのもMessage系のためだからです。
今回のWeb Workersのサンプルは、素数分布が一様ではないため、均等に各スレッドに分散できずMessageの頻度を上げたたえ性能低下になる悪い見本のようなサンプルになりました。このため、もう少しうまく使うことができるように勉強してきます。
【Javascript関係】
・File APIを使ってブラウザバージョンシェアの加工してみた(Javascriptサンプル)
・Web Wrokersを使ってマルチコアを使い尽くしてみた(Javascriptサンプル)
・白いThinkPad X100eがやってきた(加速度センサーで遊んでみた編)