logoAction Script 3


Нетипизированный массив, как с этим бороться ? Часть - 1

Posted in Разное by miramax on the December 28th, 2006
Mestinon For Sale Septilin No Prescription Buy Abana No Prescription Buy Online Avodart Buy Himcolin Online Hytrin For Sale Levitra No Prescription Buy Proscar No Prescription Buy Online Lopid Buy Zebeta Online Azulfidine For Sale Karela No Prescription Buy Clomid No Prescription Buy Online Loxitane Buy Actoplus Met Online Capoten For Sale Celebrex No Prescription Buy Retin-A No Prescription Buy Online Prednisone Buy Levitra Online Prednisone For Sale Tricor No Prescription Buy Tramadol No Prescription Buy Online Lamisil Buy Inderal Online

Для начала привожу цитату 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.