Flash Zone Forum > Механизм реального наследования в AVM2
Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Механизм реального наследования в AVM2
Flash Zone Forum > Macromedia Flash > ActionScript
chingachgoog
Есть интересный мануальчик Actionscript 3.0 and Performance Tuning

В нем несколько интересных картинок:

Нажмите для просмотра прикрепленного файла

Что обозначают буквы на желтых плашках, так и не догнал sad.gif

Или вот еще:

Нажмите для просмотра прикрепленного файла

Не пойму что-то как одновременно рантаймом управляет и интерпретатор и некий 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-битные части и исполняется только интерпретатором - это объяснило бы замедление кода без типизации, по сравнению с точно таким же кодом, но с типизацией.
MustLive
Цитата
по-ходу картинки напрямую вижу только я? Как их вставить с локального компа, чтобы было видно всем?

chingachgoog, не переживай, картинки видят все.

Чтобы картинки были видны всем участникам форума, нужно или закачивать их на форум (как это ты сейчас сделал), или же размещать на хостингах изображений и в посте указывать на них прямую ссылку.
chingachgoog
Цитата(MustLive @ 3.03.2009 - 22:37) *
chingachgoog, не переживай, картинки видят все.


Понял. Я заходил с другого компа как гость и в этом случае картинки видны не были. Как только авторизовался - все стало видно.
chingachgoog
Нашел в руководстве адоба flash_as3_programming.pdf некоторые пояснения.
Нажмите для просмотра прикрепленного файла
Итак это схема для кода
Код
class A {}

Т.е. буква А - это название класса
C - Class
T - traits (свойства)
P - prototype
O - не ясно. Можно предположить, что это просто Object - предельный родительский объект от которого все наследуется.

Итак, что видно из схемы.
Когда мы создаем класс А, то создаются 4 объекта.
Два из них очевидны (и к ним можно обращаться напрямую):
1) Са - объект класса А (обращаться к нему можно напрямую: А)
2) Pа - объект прототипа класса А (обращаться через А.prototype)
Два других неочевидны и представляют собой внутреннюю реализацию модели "на настоящих классов" AVM2:
1) Тса - объект признаков класса. Это внутренний тип класса. Он хранит статические свойства класса.
2) Та - объект признаков экземпляра. Сюда записываются свойства класса и сюда копируются свойства (или указатели на них) суперклассов.
Разработчики не гарантируют, что последние два объекта могут сохраниться в дальнейших версиях.

Цепочка видимости наследуемых свойств сначала идет в Та и лишь потом в  Pа.
chingachgoog
Несколько полезных ссылок.
Немного не по теме наследования, но зато по теме РЕАЛЬНОГО механизма работы ФП и 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
chingachgoog
Вообще джиттер работает неуловимо туго и непредсказуемо.

Вот тут расписаны некоторые результаты про разницу компиляции между
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-компилируемую часть от внешних функций. Это еще тот вопрос...
Moonlight
Наверное, должно быть так:
Код
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
chingachgoog
Цитата(Moonlight @ 26.07.2011 - 15:49) *
Наверное, должно быть так:
Код
// 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

Крайне забавные результаты...
Русская версия IP.Board © 2001-2013 IPS, Inc.