понедельник, 17 марта 2008 г.

Flash/Flex CS3 fast loops

Протестировал скорость работы циклов и массивов во флексе.
Результаты интересные:

  1. Тип переменной цикла int или uint не играет роли для скорости самого цикла (точнее цикл по int быстрее цикла по uint на 0,9%);
  2. Обращения к массиву по индексу uint быстрее индекса int на 3%;
  3. Скорость цикла по int с преобразованием к индексу массива uint такая же, как если сразу завести цикл по uint и обращаться к массиву по индексу uint. (т.е. выиграть за счет п.1 не удается);
  4. При работе с массивом, циклы работающие с конца (i--), тормознее циклов работающих с начала (i++) на 3,7%;
  5. Попытки типизировать массив [ArrayElementType("Number")] ничего не дают. Эта фича не работает вообще вне Flex Builder;
  6. Объявление длины обрабатываемого массива как var то же, что и const;
  7. Переменную цикла можно объявить как const! Но никакой разницы с var нет;
  8. Локальность/глобальность обрабатываемого массива безразлична;
  9. Выносить вычисление размера массива из цикла действительно необходимо. Очень большие потери в скорости, например в 40%;
  10. Циклы while и for по скорости друг от друга не отличаются.
Итого, самый быстрый (и безопасный) цикл по массиву выглядит так:
const len: uint = Arr.length;
for (var i: uint = 0; i < len; i++) {
  Arr[i] = ...
}
...или так...
const len: uint = Arr.length;
var i: uint = 0;
while (uint(i++) < len) {
  a[i] = ...
}