【发布时间】:2010-07-30 13:25:37
【问题描述】:
只是想知道使用是否有任何优势
private static const
而不是
private const
对于私有常量?
如果您只有一个或多个类的实例,这会改变吗?
我怀疑如果您有多个类实例,可能使用static 会带来一些小的内存/性能优势。
【问题讨论】:
标签: flash actionscript-3 actionscript
只是想知道使用是否有任何优势
private static const
而不是
private const
对于私有常量?
如果您只有一个或多个类的实例,这会改变吗?
我怀疑如果您有多个类实例,可能使用static 会带来一些小的内存/性能优势。
【问题讨论】:
标签: flash actionscript-3 actionscript
正如 mmsmatt 指出的那样,它们节省了一些内存。但是,通常这不是节省内存的最佳位置。您应该担心内存泄漏、高效的文件格式和一般的数据表示。
静态常量的一个缺点是所有全局访问都比本地访问慢。 instance.ident 优于 Class.ident。运行此代码进行测试:
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.utils.*;
public class Benchmark extends Sprite {
private static const delta:int = 0;
private const delta:int = 0;
private var output:TextField;
public function Benchmark() {
setTimeout(doBenchmark, 1000);
this.makeOutput();
}
private function doBenchmark():void {
var i:int, start:int, sum:int, inst:int, cls:int;
start = getTimer();
sum = 0;
for (i = 0; i < 100000000; i++) sum += this.delta;
out("instance:", inst = getTimer() - start);
start = getTimer();
sum = 0;
for (i = 0; i < 100000000; i++) sum += Benchmark.delta;
out("class:", cls = getTimer() - start);
out("instance is", cls/inst, "times faster");
}
private function out(...args):void {
this.output.appendText(args.join(" ") + "\n");
}
private function makeOutput():void {
this.addChild(this.output = new TextField());
this.output.width = stage.stageWidth;
this.output.height = stage.stageHeight;
this.output.multiline = this.output.wordWrap = true;
this.output.background = true;
}
}
}
【讨论】:
instance is 1.01 times faster。但是,当我将每个测试的getTimer() - start 调用移到out(...) 调用之外时,我的平均值约为instance is 0.84 times faster。所以看起来,与三年前 back2dos 所声称的相反,现在这个测试用例中的全局访问实际上比本地访问快。
private static const 成员每个类型存储一次。
private const 成员在每个实例中存储一次。
是的,你节省了一些内存。
【讨论】:
视情况而定。
如上所述,静态将每个类型一次,非静态将每个实例一次,因此这取决于您将拥有多少个实例。
我之所以这么说是因为如果您有一个一次只实例化一次的组件(如提示弹出窗口)并且您在之后将其从内存中完全处理掉,那么这意味着您使用的是静态内存使用了不必要的内存因为它永远不会消失那个静态变量。 如果它是您将拥有多个实例(如粒子或多个窗口)的东西,那么是的,最好使用静态,因为它们将共享相同的变量。
【讨论】: