1

これらの1つは、他よりも特に効率的ですか?


1:

クラスA内:

var b:B = new B();
b.addEventListener(B.TYPE1, onType1);
b.addEventListener(B.TYPE2, onType2);
b.addEventListener(B.TYPE3, onType3);

クラスB内:

dispatchEvent(new Event(TYPE1));
.
.
.
dispatchEvent(new Event(TYPE2));
.
.
.
dispatchEvent(new Event(TYPE3));

2:

クラスA内:

var b:B = new B();
b.addEventListener(CEvent.TYPE, onCEvent);
.
.
.
private function onCEvent(pEvent:CEvent):void
{
    switch (pEvent.code)
    {
        case B.TYPE1:
            onType1();
            break;

        case B.TYPE2:
            onType2();
            break;

        case B.TYPE3:
            onType3();
    }
}

クラスB内:

dispatchEvent(new CEvent(TYPE1));
.
.
.
dispatchEvent(new CEvent(TYPE2));
.
.
.
dispatchEvent(new CEvent(TYPE3));

クラスCEvent:

public class CEvent extends Event
{
    public static const TYPE:String = "cEvent";

    private var m_strCode:String;
    public function get code():String
    {
        return m_strCode;
    }

    public function CEvent(pCode:String, bubbles:Boolean=false,
            cancelable:Boolean=false)
    {
        super(TYPE, bubbles, cancelable);
        m_strCode = pCode;
    }

    override public function clone():Event
    {
        return new CEvent(m_strCode, bubbles, cancelable);
    }
}

私の理解では、#2は#1よりもはるかに時間効率が高く、今のところ、コードを可能な限り高速に実行するためのさまざまな方法を見つけることに真剣に取り組む必要があります(ほぼビデオゲームプログラミング)。ただし、以前は2番目の手法を使用していなかったため、コード全体に散らばっているさまざまなタイプを統合するために多くの作業が必要になります。私は最初に尋ねて、これが中途半端に合理的であることを確認する必要があります。ありがとう!


編集

これを投稿してしばらくして気付いたのは、ActionScript 3のイベントモデルは、イベントが作成されるたびに新しいオブジェクトが作成されるという事実を主な理由として非効率であると批判されていることです。オブジェクトの作成は、それ自体が少しかさばるプロセスになる可能性があるため、まったく新しいオブジェクトの作成に基づくイベントモデルは、その直接的な結果としてかなり非効率になりがちです。

この質問を書いたとき、これが批判の原因であることに気づかなかったし、オブジェクトの作成が遅いという事実に気づかなかったので、それを考慮に入れると、上記のアプローチのどちらも実際にはうまく回避できませんでしたその問題。(アプローチ2は、おそらく最終的にはもっと悪いでしょう。)答えとしてそれを書き留めたくはありませんが、このスレッドにその少しのコンテキストを書き留めてほしいと思います。

4

1 に答える 1

2
  1. 最適化する必要がありますか?
  2. どちらの方法でも、違いは無視できる可能性があります。
  3. あなたswitchは、やるべきことの半ば焼けたアドホックな実装EventDispatcherです。あなたは自転車を発明しようとしています、そしてそれは四角い車輪を持っている可能性があります。これは、EventDispatcherハンドラーを追加または削除し、どのハンドラーがいつ呼び出されるかなどを管理する手段を提供する仕事です。それに不満がある場合は、どのようにEventDispatcher機能するか(なぜですか?)-それに対処する方法は、内部で何かを拡張および変更することです。または、代替の実装を作成します。少数の関数の特定のケースでローカルに「修正」しようとすると、コードに混乱が生じ、保守性が低下し、現在のところ、より冗長になります。
于 2013-01-27T09:14:43.880 に答える