2010-07-30 34 views
3

只是不知道是否有任何優勢,使用在私有常量上使用'static'有什麼好處?

private static const

代替

private const

私人常數? 如果您只有一個類或多個實例,這是否會改變? 我懷疑可能如果您有多個類的實例使用static是一些小的內存/性能優勢。

回答

7

正如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;   
     }  
    } 
} 
+0

感謝back2dos - 這是一個很好的例子 – danjp 2010-07-31 11:02:53

+0

如果類不一定需要實例化呢?在這種情況下,使用非靜態方法可能會節省內存。 – 2010-08-02 17:12:59

+0

對於好奇和懶惰,我在Flash Player Debugger版本11.7.700.169(11.6)的調試模式下運行了這段代碼幾次,並且我得到的結果平均'實例速度快了1.01倍。但是,當我將'getTimer() - start'調用移動到每個測試的out(...)'調用之外時,我對「實例速度快0.84倍」進行平均。所以看起來,與back2dos三年前所聲稱的相反,現在這個測試用例的全局訪問實際上比本地訪問快。 – mziwisky 2013-10-30 17:40:38

6

private static const成員每種類型存儲一次。

private const成員每個實例存儲一次。

所以是的,你正在節省一些內存。

+0

感謝mmsmatt,這是我懷疑 – danjp 2010-07-30 14:28:24

+2

在性能的代價。詳情請參閱我的答案。 – back2dos 2010-07-30 15:59:36

0

這取決於具體情況。

如前所述,每種類型的靜態會一次,每個實例會產生一次非靜態,所以它取決於您將要擁有多少個實例。

我這樣說,因爲如果你有一個組件只能一次實例化一次(就像彈出一個提示符),並且你完全從內存中處理掉它,那麼它就意味着你需要使用靜態的記憶,因爲它永遠不會消失那個靜態變量。 如果這是一些東西你會有多個實例(如粒子或多個窗口),那麼是最好使用靜態,因爲它們會共享相同的變量。