点は、その弱参照が...彼らは高価で遅く、より多くのスペースを消費している...ここにいくつかのベンチマークのコードです:
package {
//{ region imports
import flash.display.Sprite;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.system.System;
import flash.utils.*;
//} endregion
public class Main extends Sprite {
public function Main():void {
switch (0) {
case 0: this.benchmarkDispatchers(false); break;
case 1: this.benchmarkDispatchers(true); break;
case 2: this.benchmarkDictionaries(false); break;
case 3: this.benchmarkDictionaries(true); break;
}
}
private function benchmarkDictionaries(weakKeys:Boolean, size:uint = 1000000):void {
var a:Array = [];
for (var i:int = 0; i < size; i++)
a.push({ "foo":i });
var d:Dictionary = new Dictionary(weakKeys);
var start:int = getTimer();
var mem0:int = System.totalMemory;
for (var j:int = 0; j < size; j++)
d[a[j]] = j;
trace("adding "+size+" keys took "+(getTimer()-start)+" msecs and "+(System.totalMemory-mem0)+" B of memory with weakKeys == "+weakKeys);
}
private function benchmarkDispatchers(weakRef:Boolean, size:uint = 100000):void {
var a:Array = [];
var f:Function = function (i:*):Function {
return function():void { i; }
}
for (var i:int = 0; i < size; i++)
a.push(f(i));
var e:EventDispatcher = new EventDispatcher();
var start:int = getTimer();
var mem0:uint = System.totalMemory;
for (var j:int = 0; j < size; j++)
e.addEventListener("foo", a[j], false, 0, weakRef);
trace("adding " + size + " event handlers took " + (getTimer() - start) + " msecs and " + (System.totalMemory - mem0) + " B of memory with weakKeys == " + weakRef);
}
}
}
これは私が私のマシン上で得るものです:
adding 100000 event handlers took 679 msecs and 6922240 B of memory with weakKeys == false
adding 100000 event handlers took 1348 msecs and 13606912 B of memory with weakKeys == true
adding 1000000 keys took 283 msecs and 16781312 B of memory with weakKeys == false
adding 1000000 keys took 906 msecs and 42164224 B of memory with weakKeys == true
結果は、辞書用もう少し抜本あり、おそらく何のActionScript時間に関する関与の呼び出し、およびがないので、あなたが見ることができるようにイベントハンドラを登録する際に、いくつかのストレージ・オーバーヘッドが(必要なメモリの間の差を少なくするので、 69バイト/ハンドラと16 B ...弱参照を比較するときにyte/key)...
そうです。弱い参照を使用することは、涼しい事実についてではありません。それはあなたのためにリスナーを削除する必要はありませんあなたがスケーラブルなアプリケーションを手に入れたいならば、あなたはこの種のことを自分で行う必要があります.100%の信頼性を望むなら、GCが仕事をすることを望むことはできませんが、あなたは自分でクリーンアップをする必要があります...また、あなたはあなたのアプリで良い階層を持っているなら、おそらく多くの場合、この問題に遭遇することはありません ...意味では、弱い参照なしでは解決できない問題はまれであるため、適切なオブジェクトクリーンアップを行う時間を費やしたくありません...それは怠惰からだけでなく、本当の利点を提供するときに使用する必要があります。虚偽による虚偽...
希望に役立つ希望...;)
greetz非同期操作を行う際にオブジェクトグラフにつながために実行していないものはゴミが任意の時点で収集することができるので
私は 'System.totalMemory'はあなたに正確な結果を与えるためにチェックしないと思います。このプロパティは、Flashプラグインではなく、アプリケーションが使用するメモリによって割り当てられたメモリを返します。 –