Использование памяти объекта AS3 со статическими методами против методов экземпляра - PullRequest
4 голосов
/ 17 ноября 2010

Это было мое давнее любопытство, и я не удосужился разобраться с профилированием, и еще не видел, чтобы его спросили (для AS3):

Допустим, яиметь класс:

class MyClass {
   public function myMethod():String {
       return "some return value";
   }
}

, который будет создаваться много раз:

for (var i:Number = 0; i < 10000; i++) {
   var myObject:MyClass = new MyClass();
   trace(myObject.myMethod);
}

Будет ли изменение myMethod на статическое что-либо менять в объеме памяти моего приложения?

Достаточно ли у mxmlc умение сделать единственную ссылку на функцию?

В принципе, если я оставлю свой метод нестатичным, будут ли:

  1. Нет разницы сстатическая версия - метод в отношении памяти
  2. 10000 ссылок на небольшие экземпляры одной функции
  3. 10 000 байт-код функции дублирует

в памяти?

1 Ответ

6 голосов
/ 17 ноября 2010

Да, будет разница в использовании памяти. По сути, потому что в одном случае у вас есть один класс, а в другом - один класс и 10 000 экземпляров.

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

Этот параметр скрыт от вас в Actionscript, как и в большинстве языков (хотя другие, такие как Python, я думаю, заставляют вас объявлять параметр self / this в определении функции; вам не нужно хотя передайте его явно во время вызова).

Каждый объект хранит ссылку на свои методы (методы, объявленные в фактическом типе среды выполнения, а также унаследованные методы), обычно в структуре, называемой vtable. Протокол для вызова этих методов обычно включает в себя поиск функции в таблице и ее вызов с передачей ссылки на объект this, для которого вызывается метод, плюс остальные аргументы (если есть).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...