2011-07-08 17 views
3

誰かがis演算子のパフォーマンスに関する記事/テストを持っていますか?私はGoogle上で何かを見つけることができません、それはちょうど私の "is"のキーワードを小さすぎるとして食べています。Flash/ActionScript 3のパフォーマンスは?

コンポーネントのメッセージングシステムでis演算子を広範囲に使用する予定であるため、パフォーマンスは安定している必要があります。私はちょうどできるか​​どうかは、各メッセージのIDとID-検索の仕組みを考え出すことから私を救う:私はショーをやった

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

タイミングテストを、それが整数と同じくらい高速です比較するので、私はただ確実にしたい。

誰もが独自のテストを行ったり、いくつかの記事を知っていますか?

ありがとうございました。

+4

"時間の約97%という小さな効率を忘れてはならない:時期尚早の最適化はすべての悪の根源だ" - Donald Knuth – Allan

答えて

9

"is"演算子は、1秒間に数万回のテストでも高速です。

それだけでなく、継承階層を比較するためのクラスプラクティス(例:Image is UIComponentの場合と比較して)と、インターフェイスの実装のサポート(例:Image is IEventDispatcherとの比較)がベストプラクティスです。

より:http://livedocs.adobe.com/flex/3/html/03_Language_and_Syntax_09.html#122921

ので、はい、それは十分な速さだ - と、そうでない場合は、あなたのデザインの意志にそれを曲げるために、言語の基礎ベストプラクティスを破るために抱えています - あなたはそれを間違ってやっています。

:)

+0

ありがとう、ネイト - 私はこのシステムを続けていくつもりです。 –

+0

合意。 Flashはタイプベースの比較で非常に優れています。 –

+0

お答えいただきありがとうございます! :) – Nate

0

このisオペレータは少し遅いです。私は百万回の繰り返しを行い、各反復の間に、私は90回のテスト(9つの000 000テストの合計)を行っ

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; 
    ... 
} 


私のテストでは、このようなものを見ました。 (10回の試験の平均)の結果は次のとおりであった:

is operator    : 1974 ms 
int static const compare : 210.7 ms 
int instance const compare : 97 ms 
int literal compare  : 91.9 ms 

それが十分に明確ではない念の最後の3つの試験結果について注意:それぞれが依然として整数比較はないが、テストは異なる 種類が格納されている方法で :あなたもせずにきちんとあなたのコードを維持するために、ここで構成定数を使用することができます(

// 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 
    ... 
} 

だから基本的には、整数の比較は常に速く、あなたがリテラル値またはインスタンス変数を使用する場合の違いは巨大です変数を使用するとパフォーマンスが低下します)。

関連する問題