![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|
![]() Ветеран конференции ![]() ![]() ![]() ![]() ![]() Группа: Пользователь Сообщений: 1239 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144 ![]() |
Есть интересный мануальчик Actionscript 3.0 and Performance Tuning
В нем несколько интересных картинок: ![]() Что обозначают буквы на желтых плашках, так и не догнал ![]() Или вот еще: ![]() Не пойму что-то как одновременно рантаймом управляет и интерпретатор и некий JIT компилятор??? add: по-ходу картинки напрямую вижу только я? Как их вставить с локального компа, чтобы было видно всем? add: Just-in-time compilation (JIT) (также известна как dynamic translation) — компиляция «на лету» — это технология увеличения производительности программных систем, использующих байт-код. MIR: Macromedia Intermediate Representation - межплатформенная (абстрактная) часть движка JIT Machine Code (MD) Generation - конкретная (заключительная) часть движка JIT под конкретную платформу (x86, PowerPC, ARM) Насколько я понял, дело обстоит так: Весь код на уровне класса разбирается на две половины: 1) Создается особый метод - Инициализатор класса, который включает в себя некие функции инициализации ($init, $cinit) - такие как статические определения, код не относящийся к переменным и методам класса. Инициализатор класса выполняется сразу после определения класса и всего ОДИН раз. Основная особенность - байт-код исполняется в режиме интерпретации, т.е. без участия JIT, т.е. медленно. 2) Код свойств и методов вторично компилируется и обрабатывается через JIT, т.е. довольно быстро. Скорее всего код динамических классов также не способен выполняться JIT и потому исполняется в режиме обычной интерпретации. Возможно, что нетипизированный код также распределяется на 32-битные части и исполняется только интерпретатором - это объяснило бы замедление кода без типизации, по сравнению с точно таким же кодом, но с типизацией. Сообщение отредактировал chingachgoog - 9.06.2009 - 14:18 -------------------- |
|
|
![]()
Сообщение
#2
|
|
Ветеран конференции ![]() ![]() ![]() ![]() ![]() Группа: Flash Zone Team Сообщений: 4988 Регистрация: 10.03.2005 Из: Киев Пользователь №: 5 ![]() |
Цитата по-ходу картинки напрямую вижу только я? Как их вставить с локального компа, чтобы было видно всем? chingachgoog, не переживай, картинки видят все. Чтобы картинки были видны всем участникам форума, нужно или закачивать их на форум (как это ты сейчас сделал), или же размещать на хостингах изображений и в посте указывать на них прямую ссылку. -------------------- Best wishes & regards,
MustLive Администратор сайта http://mlfun.org.ua |
|
|
![]()
Сообщение
#3
|
|
![]() Ветеран конференции ![]() ![]() ![]() ![]() ![]() Группа: Пользователь Сообщений: 1239 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144 ![]() |
chingachgoog, не переживай, картинки видят все. Понял. Я заходил с другого компа как гость и в этом случае картинки видны не были. Как только авторизовался - все стало видно. -------------------- |
|
|
![]()
Сообщение
#4
|
|
![]() Ветеран конференции ![]() ![]() ![]() ![]() ![]() Группа: Пользователь Сообщений: 1239 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144 ![]() |
Нашел в руководстве адоба flash_as3_programming.pdf некоторые пояснения.
![]() Итак это схема для кода Код class A {} Т.е. буква А - это название класса C - Class T - traits (свойства) P - prototype O - не ясно. Можно предположить, что это просто Object - предельный родительский объект от которого все наследуется. Итак, что видно из схемы. Когда мы создаем класс А, то создаются 4 объекта. Два из них очевидны (и к ним можно обращаться напрямую): 1) Са - объект класса А (обращаться к нему можно напрямую: А) 2) Pа - объект прототипа класса А (обращаться через А.prototype) Два других неочевидны и представляют собой внутреннюю реализацию модели "на настоящих классов" AVM2: 1) Тса - объект признаков класса. Это внутренний тип класса. Он хранит статические свойства класса. 2) Та - объект признаков экземпляра. Сюда записываются свойства класса и сюда копируются свойства (или указатели на них) суперклассов. Разработчики не гарантируют, что последние два объекта могут сохраниться в дальнейших версиях. Цепочка видимости наследуемых свойств сначала идет в Та и лишь потом в Pа. -------------------- |
|
|
![]()
Сообщение
#5
|
|
![]() Ветеран конференции ![]() ![]() ![]() ![]() ![]() Группа: Пользователь Сообщений: 1239 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144 ![]() |
Несколько полезных ссылок.
Немного не по теме наследования, но зато по теме РЕАЛЬНОГО механизма работы ФП и AVM2: Неизвестные и полезные настройки дебаг ФП: http://jpauclair.net/2010/02/10/mmcfg-treasure/ Adobe® Flash® Player 10 Administration Guide http://www.adobe.com/devnet/flashplayer/ar...admin_guide.pdf ActionScript Virtual Machine 2 (AVM2) Overview http://www.adobe.com/devnet/actionscript/a...vm2overview.pdf Работа с виртуальной памятью (опкоды, а-ля алхимия) http://www.ncannasse.fr/blog/virtual_memory_api?lang=en -------------------- |
|
|
![]()
Сообщение
#6
|
|
![]() Ветеран конференции ![]() ![]() ![]() ![]() ![]() Группа: Пользователь Сообщений: 1239 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144 ![]() |
Вообще джиттер работает неуловимо туго и непредсказуемо.
Вот тут расписаны некоторые результаты про разницу компиляции между obj={} и obj=new Object Так как байткод у {} короче, то понятно, что в режиме интерпретации {} выполняется шустрее. Но авторы утверждали, что в джиттере быстрее выполняется new Object ! Проверил я (CS3) и результаты у меня стойко одинаковые: {} ВСЕГДА БЫСТРЕЕ, а вызов через функцию логично еще более замедляет процесс. Попробовал я сделать как бы без джиттера - результаты вышли еще более интересные: Код package { import flash.utils.getTimer public class SpeedCheck { public var t1:int=getInterpretationCurley() public var t2:int=getInterpretationNew() public function SpeedCheck(){ } public function curley() { var obj:Object var time:int=getTimer() for (var i:int = 0; i < 1000000; i++) { obj = {} } return (getTimer()-time) } public function newObject() { var obj:Object var time:int=getTimer() for (var i:int = 0; i < 1000000; i++) { obj = new Object } return (getTimer()-time) } } } import flash.utils.getTimer function getInterpretationCurley():int{ var obj:Object var time:int=getTimer() for (var i:int = 0; i < 1000000; i++) { obj = {} } return (getTimer()-time) } function getInterpretationNew():int{ var obj:Object var time:int=getTimer() for (var i:int = 0; i < 1000000; i++) { obj = new Object } return (getTimer()-time) } Вызывать так: Код var a:SpeedCheck=new SpeedCheck() trace("interpret {} "+a.t1) // 515 trace("interpret new "+a.t1) // 515 trace("JIT {} "+a.curley()) // 500 trace("JIT new "+a.newObject()) // 731 Правда я не уверен, что интерпретируемая часть (объявление класса) не использует JIT-компилируемую часть от внешних функций. Это еще тот вопрос... -------------------- |
|
|
![]()
Сообщение
#7
|
|
Новичок ![]() Группа: Новичок Сообщений: 2 Регистрация: 23.07.2011 Пользователь №: 10600 ![]() |
Наверное, должно быть так:
Код var a:SpeedCheck=new SpeedCheck() trace("interpret {} "+a.t1) // 312 // a.t2 instead of a.t1 trace("interpret new "+a.t2) // 218 trace("JIT {} "+a.curley()) // 312 trace("JIT new "+a.newObject()) // 216 В комментариях указал время, которое получилось у меня. Кстати, запускал в Flash Player 11.0.1.60 Сообщение отредактировал Moonlight - 26.07.2011 - 14:57 |
|
|
![]()
Сообщение
#8
|
|
![]() Ветеран конференции ![]() ![]() ![]() ![]() ![]() Группа: Пользователь Сообщений: 1239 Регистрация: 27.02.2009 Из: Moscow Пользователь №: 9144 ![]() |
Наверное, должно быть так: Код // a.t2 instead of a.t1 Да-да, разумеется. Чуть изменил код, чтобы отсечь влияние трейса и вообще дебажного плеера (tf - текстовое поле на стейдже): Код var a:SpeedCheck=new SpeedCheck() var S:String="" S+="interpret {} "+a.t1+"\rinterpret new "+a.t2+"\rJIT {} "+a.curley()+"\rJIT new "+a.newObject() tf.text=flash.system.Capabilities.playerType+" "+flash.system.Capabilities.version+" isDebugger="+flash.system.Capabilities.isDebugger+"\r"+S И вот что у меня вышло: При запуске в SC4: External WIN 10,0,2,54 isDebugger=true interpret {} 515 interpret new 668 JIT {} 508 JIT new 655 При запуске с рабочего стола: StandAlone WIN 10,0,2,54 isDebugger=false interpret {} 472 interpret new 647 JIT {} 473 JIT new 650 При драгэндропе в 6-й IE: (откуда-то дебаг-ФП там установился?) ActiveX WIN 10,2,153,1 isDebugger=true interpret {} 548 interpret new 310 JIT {} 563 JIT new 337 При драгэндропе в Хром: PlugIn WIN 10,3,181,35 isDebugger=false interpret {} 318 interpret new 189 JIT {} 318 JIT new 190 Крайне забавные результаты... Сообщение отредактировал chingachgoog - 27.07.2011 - 13:17 -------------------- |
|
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 8.06.2016 - 16:02 |