Performance Tip: Dictionaries and Associative Arrays
WD479 | Апрель 16, 2008Класс 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). Например:
map[ key ] = value;
или:
map[ key ] = value;
Для того, чтобы во время выполнения обратиться к вашему объекту, надо просто указать ключ для получения соответствующего значения:
Класс 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 o2 : Object in myCollection2 )
{
if ( o2.id == o1.relatedId )
{
//выполнять что-либо при совпадении
break;
}
}
}
Можно сделать вот так. Это выполнится намного быстрее:
//сначала создаём ассоциативный массив
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.





да, я тже заметил, чем чаще используешь, тем лучше и качественней результаты получаются.
кстати, насчет того, чтобы использовать чаще ассоциативные массивы, это очень хорошая идея. я попробовал получилось очень хорошо. производительность дейсвительно повысилась
оригинально вместо ключевиков слов - объекты. прочитала вроде все понятно, но вот представить это на деле никак не могу.
qrhbo xgfin upvdsi hjpis itwayglo kduspz ilbnuk
отличный пост, много полезной и интересной информации по столь занимательной теме. есть что подчеркнуть для себя.
Даа… Ну у вас или талант писать, или это скопипастено откуда-то!
Многие любят в качестве подписей использовать цитаты мудрых людей. Да и вобще иногда полезно почитать
Согласен с Мариной, пост и в правду очень познавателен, побольше бы таких…
А у меня наоборот такое ощущение, что автор этот пост откудо-то сдер …. Где-то я его уже читал…