Нетипизированный массив, как с этим бороться ? Часть - 1
Для начала привожу цитату Nirth'а:
Дело в том, что в таких забавных и пушистых языках, как например Java или C++, массивы являются инвалидами по сравнению с их братьями в ActionScript, например массив может хранить себе только экземпляры одного типа( только числа, только строки, только текстовые поля), и его размер задается в начале, и его нельзя увеличить. Спасением несчастным программистам были КОЛЛЕКЦИИ, которые позволяли хранить экземпляры разных типов (если надо было), размер их был динамическим, их можно было фильтровать и сортировать, и вообще работать с ними было в радость.
Действительно, радость. Разработчики подарили нам один тип - Array, который делает всё и сразу, благодаря чему флешерам приходится меньше думать....
А теперь о плохом.
Сила AS 3 кроется в типизации, потому, что плеер не тратит время на определение типов. Обращение к полям ссылки с дифинированным типом, происходит намного быстрее. Однако с динамическими объектами всё осталось по-прежнему. Объявив динамически переменную , мы не можем задать ей тип.
Отсюда низкая скорость обработки элементов массива.
Иногда нужно обработать оромное количество элементов, здесь "умный" массив нас конкретно обламывает.
Возьмём такой вот класс:
Допустим, у нас есть огромный массив объектов этого типа. Нам нужно в каждом объекте нужно найти сумму a+b+c и записать в переменную sum.
Решим это несколькими способами
Плеер тратит кучу времени на поиск типа, но мы можем ему помочь сделать это побыстрее ![]()
Т.е. явно преобразуя тип и убрав сравнение с длиной массива, мы сократили время в 40 (!) раз.
Обратите внимание, если написать вместо var n:Number , просто n = 0,(если мы инициализируем не типизированную переменную) проиграем в несколько раз самому первому опыту.
В последнем примере я вообще отказался от массивов используя цепь типизированных ссылок.
Проблема в том, что в рантайме нельзя объявить типизированную переменную, только на стадии компилляции. Поэтому вроде бы нельзя создать класс имитирующий типизированный массив. (но кое-какие предположения у меня есть
)
Следовательно, нам просто необходима типизированные сслыки. Куда бы их засунуть? не будем же мы заранее писать
var m1:My;
var m2:My;
...
А вот куда:
Добавим в класс My переменную next.
Как видите у этого способа есть существенный недостаток - мы не можем выбрать произвольный элемент в цепочке. Есть мысли обойти этот недостаток, ноя не готов ещё их опубликовать
В конечном итоге мы ускорили выполение скрипта в 1755/25 = 70,2 раза.
Следует отметить, что на AS2 самый оптимизированный вариант, с в 10 раз меньшим количеством элементов (у меня 1 000 000 повисает и никогда не досчитывается) , занимает более 950 милисекунд. Т.е. здесь AS3 быстрее AS2 более чем в 380 раз.
Leave a Reply
You must be logged in to post a comment.
