Прискорення getDefinitionByName(getQualifiedClassName(obj))
Якщо Ви використовуєте цей вираз:
getDefinitionByName(getQualifiedClassName(obj));
то, для прискорення виконання коду використовуйте слідуючу функцію:
import flash.utils.Proxy;
import flash.utils.getQualifiedClassName;
import flash.utils.getDefinitionByName;
import flash.system.ApplicationDomain;
function getClassDefinition(any:*):Class
{
var cls:Object = null;
if(any is Proxy){
cls = getDefinitionByName(getQualifiedClassName(any));
} else if(any is String && ApplicationDomain.currentDomain.hasDefinition(any)){
cls = getDefinitionByName(any);
} else{
cls = Object(any).constructor;
}
return cls as Class;
}
Приріст швидкості більш ніж в 6 разів ( якщо !(any is Proxy) ).
Дякую Олегові (він же a_[w]) за знайдену швидкісну блоху
Далі тест на швидкість
var s1:Sprite = new Sprite();
var t:Number = getTimer();
var c:Class = null;
/*for(var i:int=0; i<1000000; i++){
c = getDefinitionByName(getQualifiedClassName(s1)) as Class; // 9570
}*/
/*for(var i:int=0; i<1000000; i++){
c = Object(s1).constructor as Class; // 808
}*/
for(var i:int=0; i<1000000; i++){
c = getClassDefinition(s1); // 1502
}
trace(getTimer()-t);
var s2:Sprite = new c();
trace(s2, s2 is Sprite, getQualifiedClassName(s2));