只是不知道是否有任何優勢,使用在私有常量上使用'static'有什麼好處?
private static const
代替
private const
私人常數? 如果您只有一個類或多個實例,這是否會改變? 我懷疑可能如果您有多個類的實例使用static
是一些小的內存/性能優勢。
只是不知道是否有任何優勢,使用在私有常量上使用'static'有什麼好處?
private static const
代替
private const
私人常數? 如果您只有一個類或多個實例,這是否會改變? 我懷疑可能如果您有多個類的實例使用static
是一些小的內存/性能優勢。
正如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;
}
}
}
這取決於具體情況。
如前所述,每種類型的靜態會一次,每個實例會產生一次非靜態,所以它取決於您將要擁有多少個實例。
我這樣說,因爲如果你有一個組件只能一次實例化一次(就像彈出一個提示符),並且你完全從內存中處理掉它,那麼它就意味着你需要使用靜態的記憶,因爲它永遠不會消失那個靜態變量。 如果這是一些東西你會有多個實例(如粒子或多個窗口),那麼是最好使用靜態,因爲它們會共享相同的變量。
感謝back2dos - 這是一個很好的例子 – danjp 2010-07-31 11:02:53
如果類不一定需要實例化呢?在這種情況下,使用非靜態方法可能會節省內存。 – 2010-08-02 17:12:59
對於好奇和懶惰,我在Flash Player Debugger版本11.7.700.169(11.6)的調試模式下運行了這段代碼幾次,並且我得到的結果平均'實例速度快了1.01倍。但是,當我將'getTimer() - start'調用移動到每個測試的out(...)'調用之外時,我對「實例速度快0.84倍」進行平均。所以看起來,與back2dos三年前所聲稱的相反,現在這個測試用例的全局訪問實際上比本地訪問快。 – mziwisky 2013-10-30 17:40:38