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));

C类事件:

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 更节省时间,而现在,我需要真正努力寻找各种方法来使我的代码几乎尽可能快地运行(几乎就像在视频游戏编程)。早些时候我并没有使用第二种技术,所以需要做很多工作来整合散布在我的代码中的不同类型。我需要先询问并确保这是合理的。谢谢!


编辑

发布此消息后不久,我意识到 ActionScript 3 的事件模型因效率低下而受到批评,主要是因为每次创建事件时都会创建一个全新的对象。创建对象本身可能是一个稍微庞大的过程,因此基于一遍又一遍地创建全新对象的事件模型可能会因此而变得相当低效。

在我写这个问题的时候,我不知道这是批评的根源,或者对象创建很慢的事实,从这个角度来看,上述任何一种方法都不能真正解决问题那个问题。(方法 2 最终可能会更糟。)我不想把它作为答案,但我确实希望在这个线程上写下一点上下文。

4

1 回答 1

2
  1. 你确定需要优化吗?
  2. 无论哪种方式,差异都可能可以忽略不计。
  3. switch是一个半生不熟的临时实现EventDispatcher。你正在尝试发明一辆自行车,它很可能有方形轮子。这是EventDispatcher提供添加或删除处理程序的工具,管理调用什么处理程序以及何时调用等的工作。如果您对它的工作方式不满意EventDispatcher(为什么?) - 解决它的方法是扩展和更改内部的某些内容它,或编写替代实现。尝试为少数函数的某些特定情况在本地“修复”它会给您的代码带来混乱,使其难以维护,并且就目前而言,更加冗长。
于 2013-01-27T09:14:43.880 回答