Web Workersで気付いた事

Web Workersで遊んでみて、ちょっと嫌な感じの2つの点に気付いた。

複数ワーカを起動すると重い

Windowsではそうでもないのだけど、Macは複数のワーカを立ち上げるとかなり重くなる。Windowsでは1スレッドを1コアで処理しているらしく、ワーカが1つだと1コアしか負荷がかからず、2つにすると2つめのコアに負荷がかかり、負荷は単純に2倍になる。Macではスレッドをタスク分割して2コアに割り振っているようで、ワーカが1つでも2コアに均等に負荷が分散される。これは凄いことなのだが、ワーカが2つになるとタスク切り替えがかなりの負荷になるらしく、2倍以上に跳ね上がってしまう。

自分の書いたデモで2つ以上のワーカを起動できないようにしているのは、このため。

これはCPUの負荷率モニタから勝手に想像しているだけなので、実際にタスクがどのように処理されているのか分からない。ただ試した処理は素数の計算であって常にCPUに負荷をかけ続けるもので、StorageやWeb Socketを呼ぶものの場合、そんなに負荷も高くならないかもしれない。

postMessageメソッドの挙動

もう一点は、postMessageの挙動がSafariFirefoxで違うこと。postMessage(null);と書くとirefoxではnullが送信されるが、Safariではnullという文字列が送信されてしまう。また、{hoge: 1}のようなオブジェクトを引数にすると Firefoxではオブジェクトが得られるが、Safariは[object Object] という文字列が渡ってくる。どうやら内部でString(arg)相当の呼び出しているようだ。仕様では何でも渡せる事になっているので Safariが修正されるのを期待。

ただしWeb WorkersからwindowやDOM操作は禁止されているのでFirefoxでもwindowやDOM要素を渡すとエラーになります。Functionオブジェクトも受け付けないようです。

HTML5のデモサイト

http://9elements.com/io/projects/html5/canvas/
これは凄いですね。