2013年1月17日木曜日

what's transferable objects?

元ネタはこちら
workers with transferable objectとは何か?を調べて見つけたページ。
2011年の投稿なので結構前からある技術の様だ。

transferable object以前


chrome 13でweb workerとmain process間でデータのやり取りを行うのにstructured cloningと呼ばれる(HTML5の仕様に記載されているらしい)方法が使われていた。これはJavaScriptの複雑なオブジェクトをシリアライズする方法でJSONよりも使える範囲は広くImageObjectやRegExpとかでもOK。だが、オブジェクトは新規にクローンを作って伝達する仕組みになっているので、メモリコピーが発生している分遅く、H/Wスペックは不明だが、32MBのArrayBufferをweb workerに転送するのに数百ミリ秒かかるらしい。

でtransferable objectとは?

そんなstructured cloningの課題を解決する方法として開発されchromeに採用されたのがtransferable object。メモリコピーがボトルネックだった訳なので、当然の様にzero-copyであり、C/C++の世界の参照渡しを想像してもらえばよい。しかし、完全に同じと言う訳ではなく、オブジェクトを送信してしまうと、そのオブジェクトは送信元のコンテキストから送信先のコンテキストに移動してしまい、送信元のコンテキストからクリアされ、利用する事が出来なくなる。うーん、使い方を気をつけないと行けない制約だ。

で、transferable objectを使う為のAPIは専用になっており、以下のAPIがchrome/v8には用意されている。

worker.webkitPostMessage(arrayBuffer, [arrayBuffer]);
window.webkitPostMessage(arrayBuffer, targetOrigin, [arrayBuffer]);

どの程度早くなるのか?

で最終的にどの程度早くなったのかを計測した結果が書かれている。それによると、32MBのArrayBufferを転送するのが302msecから6.6msecまで短縮されており、効果としては絶大なものがある。しかし、32MBものデータを転送するのか?とか考える人もいるだろうと思うのだが、WebGLのテクスチャー転送などで使えると書いてある(ちょっとした自動車のモデルを高精度に描画しようとすると、数MBは楽勝なので、確かに考えられるレベルではあると思う)。






0 件のコメント:

コメントを投稿