在as3中为静态const调用类的代价

时间:2010-09-15 03:54:28

标签: flash actionscript-3 actionscript

我想知道从类中调用公共静态const的有效性,成本或资源

假设我假设我有一个拥有相当多资源的类,并且调用构造函数大约是40kb的内存。

将静态常量添加到同一个类中是否有任何区别,而不是仅使用常量创建一个小类?

对于事件发送者,列出该事件的类将具有类似addEventListener(myClass.Holla,onHolla);addEventListener(myClassEventNames.Holla,onHolla);

的内容

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

3 个答案:

答案 0 :(得分:3)

没有。没有显着差异。

答案 1 :(得分:2)

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


如果有问题的事件是自定义事件,则约定是在该事件子类本身中声明特定事件类(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。如果没有元数据标签,它只会为您提供两个默认项目(激活和停用)。元数据标记告诉编译器此类调度类CustomEvent的事件并键入randomEvent - 并且编译器假定字符串常量是按照约定定义的,并为您提供CustomEvent.RANDOM_EVENT作为选项。

如果在SomeOtherClass中声明字符串常量并在元数据标记中提供该类的名称,则自动完成可能仍然有效 - 但这会产生误导,因为有问题的类不会调度任何{{}事件1}}

答案 2 :(得分:1)

你应该对此进行分析。如果设置-compiler.debug = false -compiler.optimize = true,如果使用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"

无论哪种方式,速度降低都很小。您将不得不做数以千万计的这些操作才能看到任何明显的减少。但是,您将保存一些处理,因此您将变为绿色! :)