Оптимизация Flash. Работа с элементарными типами и функциями
Технология Adobe Flash на данный момент лидирует в области мультимедиа в сети Интернет, на ее основе построено огромное количество RIA(Rich Internet Application), сайтов, игр; с помощью нее создается подавляющее число баннеров и презентаций. С выходом Action script 3, а, особенно, Adobe Flash Player 10.x возможности этой технологии возросли многократно, что позволило создавать более мощные и функциональные приложения для сети Интернет. Снежным комом растет количество online-игр и сервисов, решающих огромный круг задач (от заливки файлов на файловые хостинги, до графических редакторов, которые немногим уступают Adobe Photoshop по функциональности).
С развитием этой технологии появилось множество специалистов, занимающихся разработкой приложений на Flash. А рост интереса рынка к этой технологии требует от специалистов большего профессионализма, одним из факторов которого является более глубокое понимание Flash'а и опыт по более продуктивному использованию этой технологии.
Я занимаюсь флешем уже несколько лет и могу сказать с определенной долей уверенности, что существует некоторое количество нюансов, которые помогают более эффективно использовать ресурсы компьютера и Flash. Я не ставил себе задачу писать руководство по оптимизации, я лишь хотел показать, как ведут себя некоторые типы данных при большом количестве вычислений, что особенно актуально при разработке Flash-игр. Я поставил себе цель провести исследование по этой теме и предоставить его результаты Вам.
Принятие решения по поводу того, как использовать полученную информацию, ложится на твои плечи %habrauser%.
Впереди вас ожидают результаты шести тестов. В рамках одной статьи очень сложно охватить весь спектр проблем, связанных с оптимизацией, поэтому я предоставляю вашему вниманию лишь пять тестов, связанных непосредственно с типами данных, и один немного выбивающийся из общего ряда — тест методов доступа к переменной класса. Но обо всем по порядку.
Для начала полный список тестов. Сравниваю скорость работы:
С каждым тестом я буду приводить по два графика отображающих результаты исследуемых операций. Ось Y отображает время в миллисекундах, затраченное на 10^6 операций. Если у вас возникнут сомнения или вам захочется провести тест самостоятельно, то в конце статьи Вам будет доступна ссылка на скачивание архива с проектами на Flex/FlashDevelop. Все тесты были проведены на 10ой версии Flash Player.
И так начнем.
Сравнение по скорости работы типы данных Number, uint, int и *, относительно операций «++», «+=» и «а=а+1». В данном тесте, исследовалась простейшая, казалось бы, операция инкрементации в контексте разных типов данных. (Test_1, далее в скобочках я буду помечать таким образом названия проектов созданных для проведения каждого конкретного теста).


Вывод который можно сделать глядя на эти графики, говорит нам о том, что наиболее правильным выбором было бы типизировать данные (особого перевеса по времени между типизированными нет), так же видно, что все варианты прибавления единицы равноправны.
Сравнение скорости работы String и * в записи, чтении и добавлении(операцией += добавлялся один символ). (Test_2)


К сожалению, тесты не дают хоть сколько стабильного результата (возможно я не смог соблюсти какие то условия, вследствие чего эксперимент лишился своей чистоты :) ), который показал бы нам, что какой то из типов быстрее. Таким образом, единственный плюс класса String мне кажется это наличие в нем методов, реализующих работу со строкой.
Сравнений скорости работы Array и Vector содержащих простой тип данных (Number)
(Test_3_FD)


Как видно на чтении особой разницы не заметно, но при записи становится очевидно, что Vector оказывается быстрее, значит при оптимизации какой либо программы это может помочь, правда есть одно ограничение: Vector это фича 10го плеера, а значит если проект коммерческий и одно из требований 9ая версия, то про такой вариант оптимизации можно забыть.
Сравнений скорости работы Array и Vector содержащих сложный тип данных (экземпляр класса).
(Test_4_FD)
Код класса использующегося в эксперименте.


Такая огромная разница по времени между записью и чтением обусловлена задержкой на создание экземпляра класса TestClass. Данный тест показывает, что Vector не только не дает преимущества со сложными типами данных, но еще и уступает Array.
Сравнение скорости доступа к свойству экземпляра класса Object, методом прямого обращение (Object.variable) и строковым способом (Object[“variable”]).
(Test_6_FD)


Прямое обращение явно быстрее, но не намного.
Сравнение скорости работы типов доступа к переменной класса: прямой(public переменная), функция и setter/getter. (Test_5_FD)
Класс над которым проводился эксперимент.


При любом виде доступа простая public переменная показывает отличное время, и понятно почему — не затрачивается время на работу с функциями. На записи обычная функция и сеттер практически идут наравне, а вот чтение делает быстрее геттер. В итоге у нас есть прекрасный способ оптимизировать программу в ущерб качества кода. Вы можете закидать меня помидорками Черри за это, но лично меня он спасал не раз.
Подводя итог можно сказать, что каждый из предложенных вариантов сам по себе не так уж и эффективен, но если их применять совместно друг с другом, то в ресурсоемком коде они могут значительно увеличить производительность.
Удачи!
Исходники тестов slil.ru/28768108
С развитием этой технологии появилось множество специалистов, занимающихся разработкой приложений на Flash. А рост интереса рынка к этой технологии требует от специалистов большего профессионализма, одним из факторов которого является более глубокое понимание Flash'а и опыт по более продуктивному использованию этой технологии.
Я занимаюсь флешем уже несколько лет и могу сказать с определенной долей уверенности, что существует некоторое количество нюансов, которые помогают более эффективно использовать ресурсы компьютера и Flash. Я не ставил себе задачу писать руководство по оптимизации, я лишь хотел показать, как ведут себя некоторые типы данных при большом количестве вычислений, что особенно актуально при разработке Flash-игр. Я поставил себе цель провести исследование по этой теме и предоставить его результаты Вам.
Принятие решения по поводу того, как использовать полученную информацию, ложится на твои плечи %habrauser%.
Впереди вас ожидают результаты шести тестов. В рамках одной статьи очень сложно охватить весь спектр проблем, связанных с оптимизацией, поэтому я предоставляю вашему вниманию лишь пять тестов, связанных непосредственно с типами данных, и один немного выбивающийся из общего ряда — тест методов доступа к переменной класса. Но обо всем по порядку.
Для начала полный список тестов. Сравниваю скорость работы:
- Number, uint, int и не типизированная переменная(далее *).
- String и *.
- Array и Vector содержащие простой тип (Number).
- Array и Vector содержащие сложный тип.
- Типов доступа к Object: Object.variable и Object[“variable”]
- Типов доступа к переменной класса: прямой (public переменная), функция и setter/getter.
С каждым тестом я буду приводить по два графика отображающих результаты исследуемых операций. Ось Y отображает время в миллисекундах, затраченное на 10^6 операций. Если у вас возникнут сомнения или вам захочется провести тест самостоятельно, то в конце статьи Вам будет доступна ссылка на скачивание архива с проектами на Flex/FlashDevelop. Все тесты были проведены на 10ой версии Flash Player.
И так начнем.
Сравнение по скорости работы типы данных Number, uint, int и *, относительно операций «++», «+=» и «а=а+1». В данном тесте, исследовалась простейшая, казалось бы, операция инкрементации в контексте разных типов данных. (Test_1, далее в скобочках я буду помечать таким образом названия проектов созданных для проведения каждого конкретного теста).


Вывод который можно сделать глядя на эти графики, говорит нам о том, что наиболее правильным выбором было бы типизировать данные (особого перевеса по времени между типизированными нет), так же видно, что все варианты прибавления единицы равноправны.
Сравнение скорости работы String и * в записи, чтении и добавлении(операцией += добавлялся один символ). (Test_2)


К сожалению, тесты не дают хоть сколько стабильного результата (возможно я не смог соблюсти какие то условия, вследствие чего эксперимент лишился своей чистоты :) ), который показал бы нам, что какой то из типов быстрее. Таким образом, единственный плюс класса String мне кажется это наличие в нем методов, реализующих работу со строкой.
Сравнений скорости работы Array и Vector содержащих простой тип данных (Number)
(Test_3_FD)


Как видно на чтении особой разницы не заметно, но при записи становится очевидно, что Vector оказывается быстрее, значит при оптимизации какой либо программы это может помочь, правда есть одно ограничение: Vector это фича 10го плеера, а значит если проект коммерческий и одно из требований 9ая версия, то про такой вариант оптимизации можно забыть.
Сравнений скорости работы Array и Vector содержащих сложный тип данных (экземпляр класса).
(Test_4_FD)
Код класса использующегося в эксперименте.
package
{
/**
* ...
* @author Shirobok Pavel aka ramshteks
*/
public class TestClass
{
private var _testvar:Number;
public var _testpublicvar:Number;
public function TestClass() {}
public function testFunc():void {
trace("test");
}
public function get testvar():Number { return _testvar; }
public function set testvar(value:Number):void
{
_testvar = value;
}
}
}

Такая огромная разница по времени между записью и чтением обусловлена задержкой на создание экземпляра класса TestClass. Данный тест показывает, что Vector не только не дает преимущества со сложными типами данных, но еще и уступает Array.
Сравнение скорости доступа к свойству экземпляра класса Object, методом прямого обращение (Object.variable) и строковым способом (Object[“variable”]).
(Test_6_FD)


Прямое обращение явно быстрее, но не намного.
Сравнение скорости работы типов доступа к переменной класса: прямой(public переменная), функция и setter/getter. (Test_5_FD)
Класс над которым проводился эксперимент.
package
{
/**
* ...
* @author Shirobok Pavel aka ramshteks
*/
public class TestClass
{
public var testvar:uint;
public function TestClass() {}
public function setVar(value:uint):void {
testvar = value;
}
public function getVar():uint {
return testvar;
}
public function get testsetget():uint { return testvar; }
public function set testsetget(value:uint):void
{
testvar = value;
}
}
}

При любом виде доступа простая public переменная показывает отличное время, и понятно почему — не затрачивается время на работу с функциями. На записи обычная функция и сеттер практически идут наравне, а вот чтение делает быстрее геттер. В итоге у нас есть прекрасный способ оптимизировать программу в ущерб качества кода. Вы можете закидать меня помидорками Черри за это, но лично меня он спасал не раз.
Подводя итог можно сказать, что каждый из предложенных вариантов сам по себе не так уж и эффективен, но если их применять совместно друг с другом, то в ресурсоемком коде они могут значительно увеличить производительность.
Удачи!
Исходники тестов slil.ru/28768108



комментарии (41)