Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   работа с изменяющимися массивами (http://www.flasher.ru/forum/showthread.php?t=146515)

Psycho Tiger 10.11.2010 20:47

Цитата:

Т.е. в данном случае, что Dictionary, что Object - один хрен?
Dictionary - объектный хэш, т.е. можно пихать туда объекты.
"1" "1" - по идее, это 2 разных объекта. Но почему то он ведёт себя как один в контексте Dictionary мне неясно.
UPD: хотя, я, кстати, погорячился причем сильно. "1"==="1", а очевидно что если взять значение от одного ключа два раза - оно совпадёт. Так что всё вполне понятно.

Например, здесь:
http://ru.wikipedia.org/wiki/%D0%A5%...B8%D1%86%D0%B0
Цитата:

Выполнение операции в хеш-таблице начинается с вычисления хеш-функции от ключа. Получающееся хеш-значение i = hash(key) играет роль индекса в массиве H.

-De- 10.11.2010 21:44

Цитата:

Сообщение от Psycho Tiger (Сообщение 948894)
-De-, Вы знаете как массивы хранятся в флеш плеере? Я не знаю. Догадки тут неуместны - если говорить о лоу-левеле за ширмой abc кода, то и говорить о нём. Короче, программиста не должны волновать низкоуровневые особенности кода, в который он транслируется.

Вам пофик, жрёт ваш массив гиг оперативки или килобайт? =)

Мап (map) в данном случае переводится как "ассоциативный массив", ну или отображение. Хэш (hash table, hash map) - один из алгоритмов его реализации.

Как работают слабые ссылки у Dictionary можно понять самому, написав примерчик, типа этого (правда только для дебаг плеера работает, для обычного чуть сложнее будет).
Код AS3:

package {
        import flash.display.*;
        import flash.events.*;
        import flash.utils.*;
        import flash.system.*;
 
        public class Main extends Sprite {
                public var dict:Dictionary = new Dictionary(true);
 
                public function Main() {
                        var s:String = "test";
                        var spr:Sprite = new Sprite();
                        var val:Sprite = new Sprite();
 
                        //addChild(val);//попробуйте пооткомментировать и посмотреть
                        //addChild(spr);
 
                        dict[s] = 1;
                        dict[spr] = val;
                        System.gc();
                        addEventListener(Event.ENTER_FRAME, ef);
                }
                public function ef(ev:Event):void {
                        for (var key:Object in dict) trace(key, dict[key]);
                        removeEventListener(Event.ENTER_FRAME, ef);
                }
        }
}


Psycho Tiger 10.11.2010 22:00

О боже. Простой тип может существовать только в связке со сложным (ну или статикой, но класс тоже можно считать сложным типом), причем он не может никуда ссылаться. Он просто есть в данном месте. И если это данное место удалить - то удалится и простой тип.

Цитата:

Вам пофик, жрёт ваш массив гиг оперативки или килобайт? =)
Приведите цифры сколько что ест памяти при какой загрузке.
Конкретно у меня когда нужен объектный хэш - используется диктионари, когда строковой - обджект, чего и Вам желаю. Поэтому кто сколько "жрёт" меня не волнует - я использую инструмент там, где надо. А разницу в памяти между Obect и Dictionary юзер и не заметит - на утечках фп улетит куда больше.

TanaTiX 10.11.2010 22:02

-De-, спасибо за пример, наглядно и доступно.
Цитата:

Например, здесь:
http://ru.wikipedia.org/wiki/%D0%A5%...B8%D1%86%D0%B0
Таким образом может получится, что массив/вектор в итоге дешевле выйдет?
Самому сейчас нет желания тест скорости писать, может у кого есть ссылка по теме? Помню как-то видел, только не помню где.

Psycho Tiger 10.11.2010 22:04

Код AS3:

                        var o:Object = { };
                        var d:Dictionary = new Dictionary();
 
                        trace(getSize(o)); //24
                        trace(getSize(d)); //32
 
                        var s:String = "1";
                        var v:String = "v";
 
                        o[s] = v;
                        d[s] = v;
 
                        trace(getSize(o)); //32
                        trace(getSize(d)); //40

+4 байта на ссылку под ключ, +4 байта на ссылку под значение с каждым добавлением и там и там.
Поздравляю, Вы спасли 8 байт.
UPD: хотя, не 8, может чуть больше, возможно эти 8 байт - 2 ссылки, которые getSize считает по 4 байта. Но я думаю мысль ясна.

Добавлено через 44 секунды
Цитата:

Таким образом может получится, что массив/вектор в итоге дешевле выйдет?
Вектор/массив будет всегда быстрее хеша. Особенно если заполнение будет постепенным с 0.

-De- 10.11.2010 22:37

Цитата:

Сообщение от Psycho Tiger (Сообщение 948919)
Конкретно у меня когда нужен объектный хэш - используется диктионари, когда строковой - обджект, чего и Вам желаю.

А когда нужен числовой?
Я про то, что такие "низкоуровневые особенности кода" могут таки делать хорошую разницу =)
Если Array - ассоциативный массив на самом деле, то для того, чтобы поиметь элемент с индексом в 1000000000 ему таки меньше памяти понадобится, чем если он обычный массив. =)

alatar 10.11.2010 22:43

Теоретики, блин :) хоть кто-то из вас тест по ссылке смотрел?
60мс на 1000000 итераций это для вас хорошая разница?

Psycho Tiger 10.11.2010 22:54

Цитата:

Сообщение от alatar (Сообщение 948930)
Теоретики, блин :) хоть кто-то из вас тест по ссылке смотрел?
60мс на 1000000 итераций это для вас хорошая разница?

А мы про память :quiet:
Цитата:

А когда нужен числовой?
Array/Vector
Цитата:

Если Array - ассоциативный массив на самом деле, то для того, чтобы поиметь элемент с индексом в 1000000000 ему таки меньше памяти понадобится, чем если он обычный массив. =)
Код AS3:

var a:Array = [];
trace(getSize(a)); //40
a[1000000] = 1;
trace(getSize(a)); //48

И что это меняет? Для меня - ничего, я не работаю с памятью напрямую.
Код AS3:

var i:int = 10000000;
                        var a:Array = [];
 
                        var t:int = getTimer();
                        while (i--) a[i] = 1;
                        trace(getTimer() - t);
 
                        a = [];
                        t = getTimer();
                        for (i = 0; i < 10000000; i++) a[i] = 1;
                        trace(getTimer() - t);

Код:

2020
548

А вот это заставляет считать меня Array чуть менее ассоциативным.

И бить по пальцам тех, кто забивает в массивы значения не с 0. Во всяком случае тех, кто специально.

TanaTiX 10.11.2010 23:47

Psycho Tiger, попробуй так:
Код AS3:

for (i = 10000000; i > 0; i--)

вместо while - результат будет отличаться, но уже не так значительно

Psycho Tiger 10.11.2010 23:53

И правда, забавно, спасибо. Видимо, это издержки, что > 0 работает быстрее, чем насильно конвертировать в Boolean. Однако, суть теста не меняется )


Часовой пояс GMT +4, время: 17:26.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.