Flash / ActionScript 3中是运算符的性能?

时间:2011-07-08 03:53:21

标签: flash flex actionscript-3 actionscript air

任何人都有关于is运算符性能的文章/测试?我在Google上找不到任何东西,它只是把我的“is”关键字当作太小了。

我计划在我的组件的消息传递系统中广泛使用is运算符,因此性能需要稳固。如果我能做的话,它将使我不必为每条消息提出一个id和id-lookups方案:

function onMessage(message : Message, type : Class) : void
{
    switch(type)
    {
        case MessageOne:
            // whatever
        break;
        case MessageTwo:
            // whatever
        break;
    }
}

我所做的时间测试表明它几乎和整数比较一样快,所以我只想确定。

有人做过自己的测试或知道一些文章吗?

感谢。

2 个答案:

答案 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
    ...
}

所以基本上整数比较总是更快,如果你使用文字值或实例变量,差异很大(你甚至可以在这里使用配置常量来保持你的代码整洁,而不会影响使用变量)。