Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 3 > Типизировать массив


Автор: szz 2.2.2007, 18:36
Мы можем давать типы переменным, но можем ли задать тип массиву?
И в АС получается элементы массива - все те же динамические переменные?
Например как в С 
int arr[100]; 
- это массив, все его ячейки должны быть int.

А
var arr:Array = new Array();
создаст массив, но ячейки динамические.
Как сделать так, чтобы в элементы этого массива годились только инт?

Автор: GZep 2.2.2007, 19:03
Вы имеете ввиду ключи в массиве или значения ключей?
szz, опять вы про свой С

Автор: szz 2.2.2007, 20:52
и то и другое.
 ключи должны быть одного типа, значения - другого.
Напрмер
Код

var array:Array;
// если ключ строка, а знаечние - инт, то чтобы можно было обращаться только так:
array["some string"] = 123;
// если ключ инт, а значение - строка:
array[123] = "some string";

Автор: AntonioBanderaz 3.2.2007, 01:12
ну как вариант, расширь коллекции... 
сделай Generic коллекции... и generic мапы соответсвенно.....
http://forum.vingrad.ru/topic-118682.html

Добавлено @ 01:22 
http://as3.ru/?p=8

Автор: szz 3.2.2007, 02:37
Дааа, почитал...
Касатекльно предпоследнего примера отсюда:
http://as3.ru/?p=8\
Код

var ar:Array = []; 
 var i:int = 0;
 var m:My = new My();
 while( i < 1000000){
     m = new My();
     m.a = Math.random()*100;
     m.b = Math.random()*100;
     m.c = Math.random()*100;
     ar.push(m);
     i+=1;
 }

// пробегае по массиву, подсчитывая то, что нужно
 var t:int = getTimer();   i = 0; var l:int = ar.length;
 while( i < l){
        m = ar[i];
    m.sum = m.a + m.b + m.c;

  Если вместо своего класса использовать примитивный int - например так:
Код

var ar:Array = []; 
 var i:int = 0;
 var m:int = 0;
 while( i < 1000000){
     m = Math.round(Math.random()*100);
     ar.push(m);
     i+=1;
 }

// пробегае по массиву, подсчитывая то, что нужно
i = 0; var l:int = ar.length;
var sum:int = 0;
 while( i < l){
        m = ar[i];
    sum += m;
}

 То это как-то ускорит процесс или все же нет?

Автор: AlDev 3.2.2007, 07:56
есть такая вещь - метатеги
но действуют только для полей класса smile
Код

// Define an Array of properties for a row of components.
// Restrict the type of the Array elements to mx.core.UIComponent.
[ArrayElementType("mx.core.UIComponent")]
public var bottomRow:Array;


но это не то.

Автор: AntonioBanderaz 3.2.2007, 14:51
Цитата(szz @  3.2.2007,  02:37 Найти цитируемый пост)
 То это как-то ускорит процесс или все же нет? 

Мне кажется что нет... 

Автор: szz 3.2.2007, 19:04
Цитата

но это не то. 

  Это именно то что надо! Спасибо огромное!!!
 А то, что только члены класса - не страшно, ибо в ас3 все - члены класса...

Я сейчас проверю, насколько это быстрее.

Автор: szz 3.2.2007, 19:59
Так, результат таков.
 Использование [ArrayElementType("int")] дает только проверку во время компиляции и не влияет на тип данных (и, соответсвенно, никак не прибавляет скорость).
  Но приведение через примитивный тип переменной сработал! 30мс против 260мс! Почти в 8 раз.
При 0xfffff итераций этот пример занимает 260мс:
Код

                        var sum:int = 0;
            for(i=0;i<num;++i){
                sum += arr[i];
            }

   А этот - 30мс! :
Код

                        var sum:int = 0;
                        var n:int = 0;
            for(i=0;i<num;++i){
                n = arr[i];
                sum += n;
            }


Как это объяснить? По идее массив так или иначе отстается динамически типизированным. 
Получается что в первом случае машина тормозит перебирая типы дл прибавления.
Во втором случае мы сначало присваиваем к инту, а потом суммируем быстро два машинных значения.
Значит, при присваивании к типизированной переменной n флэш не задумывается о типе?

Автор: miramax 3.2.2007, 21:42
szz, статья как раз об этом. Только я для наглядности исполmзовал не примитив, а костомный класс в котором есть ещё и вложенные поля. Что бы показать, что по типизированной ссылке также ускоряется доступ к полям объекта.
Вот твой код:
Код

         var sum:int = 0;
         for(i=0;i<num;++i)
        {
                sum += arr[i];
        } 

Обрати внимание на строку 4, там есть оператор +. Но в AS3 не только у типа int есть такое оператор. Есть ещё строки и другие числовые типа. Поэтому AVM сначала определяет тип элемента массива, а потом производит сложение.
А в коде: 
Код

            var sum:int = 0;
            var n:int = 0;
            for(i=0;i<num;++i){
                n = arr[i];
                sum += n;
            } 

строками 2 и 4, ты явно определяешь тип переменной. Поэтому AVM не тратит время на поиск типа , выполняя строку 5, во много раз быстрее. Можно сказать что  оператор += это то же функция в объекте типа int . И поэтому доступ к этой функции-полю через типизированную ссылку происходит намного быстрее.
Аналогично в классе My из статьи, обращение к членам a, b, c происходит пыстрее через типизированную ссылку.
И на последок :
Код

            var sum:int = 0;
            var n:String = '';
            for(i=0;i<num;++i){
                n = arr[i];
                sum += n;
            } 
 
smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)