Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
  • chingachgoog
    сообщение 2.03.2009 - 18:33
    Сообщение #1


    Ветеран конференции
    *****

    Группа: Пользователь
    Сообщений: 1239
    Регистрация: 27.02.2009
    Из: Moscow
    Пользователь №: 9144



    Есть интересный мануальчик Actionscript 3.0 and Performance Tuning

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

    Прикрепленный файл  traits.jpg ( 39.25 килобайт ) Кол-во скачиваний: 13


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

    Или вот еще:

    Прикрепленный файл  AVM2.jpg ( 55.05 килобайт ) Кол-во скачиваний: 13


    Не пойму что-то как одновременно рантаймом управляет и интерпретатор и некий 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


    --------------------
    Вернуться в начало страницы
     
    +Ответить с цитированием данного сообщения
    MustLive
    сообщение 3.03.2009 - 22:37
    Сообщение #2


    Ветеран конференции
    *****

    Группа: Flash Zone Team
    Сообщений: 4988
    Регистрация: 10.03.2005
    Из: Киев
    Пользователь №: 5



    Цитата
    по-ходу картинки напрямую вижу только я? Как их вставить с локального компа, чтобы было видно всем?

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

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


    --------------------
    Best wishes & regards,
    MustLive
    Администратор сайта
    http://mlfun.org.ua
    Вернуться в начало страницы
     
    +Ответить с цитированием данного сообщения
    chingachgoog
    сообщение 3.03.2009 - 23:14
    Сообщение #3


    Ветеран конференции
    *****

    Группа: Пользователь
    Сообщений: 1239
    Регистрация: 27.02.2009
    Из: Moscow
    Пользователь №: 9144



    Цитата(MustLive @ 3.03.2009 - 22:37) *
    chingachgoog, не переживай, картинки видят все.


    Понял. Я заходил с другого компа как гость и в этом случае картинки видны не были. Как только авторизовался - все стало видно.


    --------------------
    Вернуться в начало страницы
     
    +Ответить с цитированием данного сообщения
    chingachgoog
    сообщение 8.04.2009 - 19:38
    Сообщение #4


    Ветеран конференции
    *****

    Группа: Пользователь
    Сообщений: 1239
    Регистрация: 27.02.2009
    Из: Moscow
    Пользователь №: 9144



    Нашел в руководстве адоба flash_as3_programming.pdf некоторые пояснения.
    Прикрепленный файл  ClassA.png ( 11.85 килобайт ) Кол-во скачиваний: 5

    Итак это схема для кода
    Код
    class A {}

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

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

    Цепочка видимости наследуемых свойств сначала идет в Та и лишь потом в Pа.


    --------------------
    Вернуться в начало страницы
     
    +Ответить с цитированием данного сообщения
    chingachgoog
    сообщение 12.02.2010 - 13:18
    Сообщение #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


    --------------------
    Вернуться в начало страницы
     
    +Ответить с цитированием данного сообщения
    chingachgoog
    сообщение 28.06.2011 - 19:20
    Сообщение #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-компилируемую часть от внешних функций. Это еще тот вопрос...


    --------------------
    Вернуться в начало страницы
     
    +Ответить с цитированием данного сообщения
    Moonlight
    сообщение 26.07.2011 - 14:49
    Сообщение #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
    Вернуться в начало страницы
     
    +Ответить с цитированием данного сообщения
    chingachgoog
    сообщение 27.07.2011 - 13:12
    Сообщение #8


    Ветеран конференции
    *****

    Группа: Пользователь
    Сообщений: 1239
    Регистрация: 27.02.2009
    Из: Moscow
    Пользователь №: 9144



    Цитата(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

    Крайне забавные результаты...

    Сообщение отредактировал chingachgoog - 27.07.2011 - 13:17


    --------------------
    Вернуться в начало страницы
     
    +Ответить с цитированием данного сообщения

    Ответить в эту темуОткрыть новую тему
    1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
    Пользователей: 0

     

    - Текстовая версия Сейчас: 8.06.2016 - 16:02