任何人都有关于is运算符性能的文章/测试?我在Google上找不到任何东西,它只是把我的“is”关键字当作太小了。
我计划在我的组件的消息传递系统中广泛使用is运算符,因此性能需要稳固。如果我能做的话,它将使我不必为每条消息提出一个id和id-lookups方案:
function onMessage(message : Message, type : Class) : void
{
switch(type)
{
case MessageOne:
// whatever
break;
case MessageTwo:
// whatever
break;
}
}
我所做的时间测试表明它几乎和整数比较一样快,所以我只想确定。
有人做过自己的测试或知道一些文章吗?
感谢。
答案 0 :(得分:9)
“是”运算符速度非常快,即使每秒数万次测试也是如此。
不仅如此,它确实是比较继承层次结构的最佳实践,而不仅仅是类名称(例如,比较if Image is UIComponent
)以及对接口实现的支持(因此比较Image is IEventDispatcher
例如)。
更多:http://livedocs.adobe.com/flex/3/html/03_Language_and_Syntax_09.html#122921
所以,是的,它足够快 - 而且,如果不是,你必须打破语言的基本最佳实践,将其弯曲到你的设计意愿 - 那么你做错了。
:)
答案 1 :(得分:0)
这个is
运算符有点慢
我的测试看起来像这样:
var obj:MyObj = new MyObj();
// Index type comparison
for(var a:int; a<1000000; a++){
if(obj.type == OBJ_TYPE1) continue;
if(obj.type == OBJ_TYPE2) continue;
...
}
// 'is' type comparison
var obj:MyObj = new MyObj();
for(var a:int; a<1000000; a++){
if(obj is ObjectType1) continue;
if(obj is ObjectType1) continue;
...
}
我进行了一百万次迭代,在每次迭代中,我进行了90次测试(共计9 000 000次测试)。结果如下(平均超过十次测试):
is operator : 1974 ms
int static const compare : 210.7 ms
int instance const compare : 97 ms
int literal compare : 91.9 ms
关于最后三个测试结果的说明,以防它不够清晰: 每个人仍然进行整数比较,但测试不同 如何存储类型:
// For the second test the types are stored as static constants
// int static const compare : 97.4 ms
private static const OBJ_TYPE1:int = 0;
private static const OBJ_TYPE2:int = 1;
...
// For the third test the types are stored as instance constants
// int member const compare : 1319.9 ms
private const OBJ_TYPE1:int = 0;
private const OBJ_TYPE2:int = 1;
...
// Here the types are not stored anywhere but instead literals
// are used for each test
// int literal compare : 91.9 ms
for(var a:int; a<1000000; a++){
if(obj.type == 0) continue; // OBJ_TYPE1
if(obj.type == 1) continue; // OBJ_TYPE2
...
}
所以基本上整数比较总是更快,如果你使用文字值或实例变量,差异很大(你甚至可以在这里使用配置常量来保持你的代码整洁,而不会影响使用变量)。