aclibでアプリキャストのノード操作を100倍高速化する

アプリキャストでは、getPosX()、 getW()、などノードの属性値を取得する関数がめっぽう遅いです。

// ベンチマーク
function bench(f) {
  var d = Date.now();
  for (var i = 0; i < 100; i++) f();
  print(f.name + ' -> ' + (Date.now() - d) + ' msec');
}

var node = getNode('foo');
bench(function getPosX1() { getPosX(node); });
bench(function setPosX1() { setPosX(node, 10); });
// 結果
getPosX1 -> 1563 msec
setPosX1 -> 16 msec

get系がset系に比べてめちゃくちゃ遅いことがわかります。
上記はエミュレータでの計測結果ですが、実際のTVでも同じくらい遅いです。


aclibのNodeオブジェクトでは、
一度取得したノードの属性値をキャッシュするため、2回目以降のget系の操作を高速化することができます。

// ベンチマーク
var node = new Node(getNode('foo'));
bench(function getPosX2() { node.getPosX(); });
bench(function setPosX2() { node.setPosX(10); });
// 結果
getPosX2 -> 15 msec
setPosX2 -> 16 msec

getPosX が100倍早くなっています(100回イテレーションしているので当たり前ですが)。
このようにaclibを使うとノードの属性値を繰り返し参照するような場面では、かなりの高速化をすることが可能です。


もちろんsetPosXなどでノードの属性値が更新されると、同時にキャッシュ情報も更新されますので、利用者はそのあたりの整合性に煩わされる心配はありません。