2010-07-30 2 views
3

Просто интересно, если есть какие-либо преимущества использованияЛюбое преимущество использования 'static' для частных consts?

private static const

вместо

private const

для частных констант? Это изменяется, если у вас есть только один экземпляр класса или несколько? Я подозреваю, что может быть небольшим преимуществом памяти/производительности при использовании static, если у вас есть несколько экземпляров класса.

ответ

7

Как указано в миллиметре, они сохраняют память. Обычно это не лучшее место для сохранения памяти. Вам лучше беспокоиться о утечке памяти, об эффективных форматах файлов и представлении данных в целом.

Недостатком статических констант является то, что весь глобальный доступ медленнее, чем локальный доступ. 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

thanks back2dos - это отличный пример – danjp

+0

Что делать, если класс не обязательно должен быть создан? Возможно, использование нестатического подхода может сэкономить память в этом случае. –

+0

Для любопытных и ленивых, я несколько раз запускал этот код в режиме отладки в Flash Player Debugger версии 11.7.700.169 (11.6), и у меня получилось усреднение результатов по поводу экземпляра в 1,01 раза быстрее. Но затем, когда я переместил вызовы 'getTimer() - start' за пределами' out (...) 'вызовов для каждого теста, я усреднял о том, что« экземпляр в 0.84 раза быстрее ». Таким образом, казалось бы, что, вопреки тому, что back2dos утверждал три года назад, в наши дни глобальный доступ в этом тестовом сценарии фактически является _faster_, чем локальный доступ. – mziwisky

6

private static const членов хранится один раз для каждого типа.

private const членов хранится один раз в каждом экземпляре.

Так что да, вы сохраняете память.

+0

спасибо mmsmatt, это то, что я подозревал – danjp

+2

за счет производительности. см. мой ответ для деталей. – back2dos

0

Это зависит от случая.

Как указано, статический будет один раз для каждого типа, а нестатический будет один раз для каждого экземпляра, так что это зависит от того, сколько экземпляров вы собираетесь иметь.

Я говорю это потому, что если у вас есть компонент, который создается только один раз за раз (например, всплывающее окно подсказки), и вы полностью удаляете его из памяти после, то это означает, что в качестве статичного вы используете ненужные так как он никогда не исчезнет с этой статической переменной. Если у вас есть несколько экземпляров (например, частиц или нескольких окон), тогда да, лучше использовать статические, потому что они будут использовать одну и ту же переменную.

Смежные вопросы