Прискорення 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));

Таґи: , ,

Залиште свій коментар