代码之家  ›  专栏  ›  技术社区  ›  Daniel

在as3中为静态常量调用类的成本

  •  1
  • Daniel  · 技术社区  · 14 年前

    假设我有一个类,它有相当多的资源,调用构造函数需要大约40kb的内存。

    在同一个类中添加静态常量与创建一个只有常量的小类有什么区别吗?

    在事件调度器的情况下,列出该事件的类将具有如下内容 addEventListener(myClass.Holla,onHolla); addEventListener(myClassEventNames.Holla,onHolla);

    是否存在差异(足够显著)以保证使用额外的类来存储事件名称?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Amarghosh    14 年前

    访问静态成员与构造函数无关;因此不会有任何性能问题。


    如果所讨论的事件是自定义事件,则约定是为特定事件类(事件的子类)的所有事件声明字符串常量 flash.events.Event )在这种情况下,子类本身。例如,所有鼠标事件常量都在中声明 MouseEvent MenuEvent 等。

    如果您使用的是Flex mxmlc编译器,这个约定将帮助您完成代码。假设您在类定义(MyClass)的顶部添加了以下元数据标记。

    [Event(name="randomEvent", type="com.domain.events.CustomEvent")]
    public class MyClass extends EventDispatcher { }
    

    现在声明此类的一个实例并在addEventListener中键入:

    var myClass:MyClass = new MyClass();
    myclass.addEventListener(
    

    CustomEvent.RANDOM_EVENT 在“自动完成”下拉列表中。如果没有metadata标签,它只会提供两个默认项(activate和deactivate)。元数据标记告诉编译器这个类分派一个类的事件 CustomEvent randomEvent -编译器假设字符串常量是按照约定定义的,并给出CustomEvent.RANDOM\u事件作为选择。

    如果在中声明字符串常量,则自动完成可能仍然有效 SomeOtherClass 并在元数据标记中提供该类的名称-但这会产生误导,因为所讨论的类不会发送任何 其他班级

        2
  •  3
  •   Lee    14 年前

    不,不会有显著差异。

        3
  •  1
  •   ansiart    12 年前

    你应该给这个做个轮廓。如果你设置-compiler.debug=假-compiler.optimize=真,如果您使用 SWFInvestigator 您可以看到读取某些内容所需的操作码。

    var str:String;
    str = ThisClass.TEST;
    str = TEST;
    str = SomeOtherClass.TEST;
    str = CONFIGCONSTANT::TEST;  // fastest
    
    // str = ThisClass.TEST;
    8    getproperty    private::TEST //nameIndex = 30
    
    // str = TEST;
    12   getlex         private::TEST //nameIndex = 30
    
    // SomeOtherClass.TEST;
    16   getlex         pkg::SomeOtherClass //nameIndex = 29
    18   getproperty    TEST //nameIndex = 36
    
    // CONFIGCONSTANT::TEST;
    22   pushstring     "test"
    

    无论哪种方式,速度下降都是最小的。你得做上千万次这样的手术才能看到明显的减少。但是,您将节省一些处理,因此您将变为绿色!:)