2008
04.16

Класс Dictionary (flash.utils.Dictionary) добавленный в ActionScript, как и ассоциативный массив, предоставляет возможность хранения пар ключ-значение, с той разницей, что в роли ключа в Словаре могут выступать объекты.
Andrew Trice показывает как добиться увеличения производительности используя ассоциативные массивы и класс Dictionary.

Оригинал статьи: Performance Tip: Dictionaries and Associative Arrays
Автор: Andrew Trice, Principal Architect Cynergy Systems
Перевод: WD479

Небольшой совет, который поможет увеличить производительность вашего Flex/ActionScript приложения если вы используете на клиентской стороне цикличную обработку большого количества данных. Используйте класс Dictionary или ассоциативные массивы так часто, насколько это возможно.

Вместо того, чтоб проверять в цикле большое количетсво элементов, пытаясь найти объект по одному из его свойств, можно использовать ассоциативные массивы. Таким образом вы быстро и легко найдёте то, что искали не перебирая всё подряд. Ассоциативные массивы (hashes/maps) позволяют вам создавать связки ключ-значение используемые для создания таблицы-соответствия данных/объектов.

В ActionScript, для связывании строковых ключей с объектами, указанным в качестве значения, вы можете использовать класс Объект (Object) или Массив (Array). Например:

var map : Object = new Object();
map[ key ] = value;

или:

var map : Array = new Array();
map[ key ] = value;

Для того, чтобы во время выполнения обратиться к вашему объекту, надо просто указать ключ для получения соответствующего значения:

mySavedValue = map[ key ];

Класс Dictionary хоть и очень похож на ассоциативные массивы, но является более мощным инструментом. Он позволяет вам составлять связки ключ-значение, где ключ может быть объектом. Например:

var map : Dictionary = new Dictionary();
var key1 : Object = new Object();
var key2 : Sprite = new Sprite();
var key3 : UIComponent = new UIComponent();
map[ key1 ] = value1
map[ key2 ] = value2
map[ key3 ] = value3

Это особенно полезно в случаях, когда для обработки данных используются вложенные циклы.
Чем делать таким образом:

for each ( var o1 : Object in myCollection1 )
{
    for each ( var o2 : Object in myCollection2 )
    {
        if ( o2.id == o1.relatedId )
        {
            //выполнять что-либо при совпадении
            break;
         }
     }
}

Можно сделать вот так. Это выполнится намного быстрее:

var map : Object = new Object();
//сначала создаём ассоциативный массив
for each ( var o2 : Object in myCollection2 )
{
    map[ o2.id ] = o2;
}
//проходим по элементам другого массива,
//используя созданный map
for each ( var o1 : Object in myCollection1 )
{
    var foundObject : * = map[ o1.relatedId ];
    //делаем что-либо с найденным объектом
}

Чем проходить циклом по неизвестному числу элементов в двух массивах, вы просто проходите под первому массиву и составляете ассоциативный массив, а затем проходите по второму, сравнивая со значением созданного ассоциативного массива.

Если правльно их использовать, то вы будете учивленны разницей в производительности. Их можно применить для названий функций, чтоб получать доступ к соответствующим данным, да и просто в любых случаях когда надо обрабатывать большое количество данных. Если вы столкнётесь с этим – просто создайте ассоциативный массив один раз и используйте его в любое время в вашем приложении. Это поможет избежать загрузки процессора ненужным перебором элементов массива.

При использовании класса Dictionary надо быть внимательным и убирать за собой, иначе появятся утечки памяти. За дополнительной информацией обратитесь к livedocs.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

No Comment.

Add Your Comment