我想测试一个对象是一个向量,任何向量,而不仅仅是一个单一类型的向量.
我跑了一个测试:
var v:Vector.<int> = new Vector.<int>();
v.push(3);
v.push(1);
v.push(2);
trace(v is Array); // false
trace(v is Vector); // false
trace(v is Vector.<int>); // true
trace(v is Vector.<*>); // false
Run Code Online (Sandbox Code Playgroud)
似乎唯一返回true的是指定矢量类型的那个,但我想测试它为任何类型.
我需要一种非常有效的方法来比较,因为getQualifiedClassName它太慢了.
我目前的做法是:
private static function isVector(obj:Object):Boolean {
return (getQualifiedClassName(obj).indexOf('__AS3__.vec::Vector') == 0);
}
Run Code Online (Sandbox Code Playgroud)
但它比is运营商慢2倍.
我需要速度,因为它是一个对象序列化类,它需要非常快.
问题是Vector.**是一个与<Number>,<int>或<uint>不同的类.数字原语具有特殊类以提高效率.String和Boolean也是基元,但与数字基元不同,它们由<*>检测.因此,您只需要测试通用Vector和3种数字类型.
这个解决方案的速度是getQualifiedClassName的2倍,在最坏的情况下,对象不是Vector,或者是Vector.<uint>,如果对象是非原始基类型Vector,就像Vector一样快5倍<对象>:
return (obj is Vector.<*>
|| obj is Vector.<Number>
|| obj is Vector.<int>
|| obj is Vector.<uint>);
Run Code Online (Sandbox Code Playgroud)
这是一个简单的测试:
var moo:Vector.<uint> = new Vector.<uint>();
var timer:Timer = new Timer();
var b:Boolean;
timer.startTimer();
for (var i:int = 0; i < 1000000; i++)
{
b = (moo is Vector.<*>
|| moo is Vector.<Number>
|| moo is Vector.<int>
|| moo is Vector.<uint>);
}
logger.info(" is timer: " + timer.endTimer());
timer.startTimer();
for (i = 0; i < 1000000; i++)
{
b = (flash.utils.getQualifiedClassName(moo).indexOf('__AS3__.vec::Vector') == 0);
}
logger.info("gqcn timer: " + timer.endTimer());
[LOG] com.tcg.test: is timer: 320
[LOG] com.tcg.test: gqcn timer: 756
Run Code Online (Sandbox Code Playgroud)
将moo更改为Vector.<Object>:
[LOG] com.tcg.test: is timer: 158
[LOG] com.tcg.test: gqcn timer: 743
Run Code Online (Sandbox Code Playgroud)
小智 1
其他方法效率太低,所以我仍然使用我的方法:
private static function isVector(obj:Object):Boolean {
return (getQualifiedClassName(obj).indexOf('__AS3__.vec::Vector') == 0);
}
Run Code Online (Sandbox Code Playgroud)