如何测试一个对象是否是一个向量?

5 actionscript-3

我想测试一个对象是一个向量,任何向量,而不仅仅是一个单一类型的向量.

我跑了一个测试:

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倍.

我需要速度,因为它是一个对象序列化类,它需要非常快.

Sco*_*t A 7

问题是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)

  • @M28我不认为你的意思是效率低下。我认为你的意思是其他方法需要太多代码,或者它们看起来不优雅,但它们更有效,因为它们不使用内省 (2认同)