Показать сообщение отдельно
Старый 25.01.2011, 17:56
JackFromChaos вне форума Посмотреть профиль Отправить личное сообщение для JackFromChaos Найти все сообщения от JackFromChaos
  № 68  
Ответить с цитированием
JackFromChaos
 
Аватар для JackFromChaos

блогер
Регистрация: Jan 2008
Адрес: Донецк
Сообщений: 162
Записей в блоге: 2
Отправить сообщение для JackFromChaos с помощью Skype™
2wvcvw:
Не знаю, нужно ли это...
Могу сказать, что анонимная функция компилируется приблизительно так же, как обычная. Но она как бы является объектом, который в момент создания получает, кроме всего прочего, контекст исполнения.
Грубо говоря, массив всех локальных переменных функции в которой была вызвана.
Это приблизительно... на глазок. Разбираться детальнее влом.
Но факт, занимает в памяти она больше. По идее, работает слегка медленее, за счет того, что переменные из контекста выуживает по имени...

Это результат 10 минут изучения opcode полученных путем: https://github.com/CyberShadow/RABCDAsm

Добавлено через 8 минут
Короче так... При создании анонимной функции создается класс, скорее всего наследник Function, среди членов которого есть что-то типа Dictionary всех локальных переменных функции, в которой она была создана. Далее она исполняется как и обычная Function, но в случае наличия в коде переменных из родительских функций, она читает свой Dictionary с этими переменными...
Соответственно размер анонимной функции больше обычной приблизительно на объем локальных переменных родительской функции.

Добавлено через 49 минут
Подозревая, что вся разница с c# заключается в том, что в c# переменные родительской функции храняться не в Dictionary, и копируются не все,а только те, что используются непосредственно в анонимной функции. Т.е. в конечном этого затрат вообще никаких практически.

Но в AS3 затраты тоже не мега большие получаются, если разобраться...

В конечном этого стоит понимать, что addEventListener тоже принимает указатель на функцию - суть тот же callback.
Т.е. разницы между:
Код AS3:
_closeButton.addEventListener(MouseEvent.CLICK, onHide);
и
Код AS3:
_closeButton.addEventListener(MouseEvent.CLICK, function(e:Event):void{visible=false;});
если в функции из которой происходила подписка не будет переменных, будет не особо большая...

Это не к тому, что бы продолжить спор А просто делюсь наблюдениями...

Добавлено через 2 часа 20 минут
Судя по всему, класс "анонимная функци", сам по себе весит довольно много(710 байт). Работает где то на 7% медленее обычной функции
В 3 раза быстрее, чем класс отсюда http://www.flasher.ru/forum/blog.php?b=305 (по большей части это связано со скоростью работы фунцкии Function.apply)
addEventListner работает где то в 4 раза быстрее, чем создание анонимной функции.
Все это меркнет в сравнении скорости работы функции dispatchEvent. Она работает в 26 раз медленее чем вызова анонимной функции. И более чем в 9 раз медленнее чем метод execute в классе Callback.

Добавлено через 2 часа 53 минуты
Пора переходить на сигналы
__________________
Искренне Ваш, Джек.


Последний раз редактировалось JackFromChaos; 25.01.2011 в 18:13.