Форум 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=208081)

ChuwY 03.06.2014 12:33

Ваша проверка делает абсолютно то же самое.
Только утверждение там обратное. "Если такого свойства нет".
И скорость гораааздо больше, чем вы пишете.
И нет. Там не перебор.

SvetozarPNZ 03.06.2014 12:45

Цитата:

Сообщение от alexandrratush (Сообщение 1167263)
Или использовать обычный массив со строками-ключами, тут почитать можно.

Почитал. Там были объекты, о которых я и сам спрашиваю, словари, как расширение объектов, а про массивы там написано

Код AS3:

Использование конструктора Array для создания ассоциативного массива не дает никаких особых преимуществ.

Задаюсь вопросом, зачем вы это советуете :)

elder_Nosferatu 03.06.2014 12:46

На знаю как далеко зашли в оптимизации сортировки массивов, но те методы, которые я учил на уроках информатики в школьные годы не назовешь очень быстрыми... Короче, трудовой мозоль на пятой точке подсказывает мне, что плеер быстрее найдет свойство обьекта своими методами, чем вы будете его из-под палки заставлять сортировать ничем ему не интересный массив. Да и поиск свойства осуществляется максимум полным пребором все имеющихся свойств, а сортировку массива за один проход не сделаешь :(. Плюс поиск предполагает только операцию сравнения, а сортировка - кроме сравнения еще и присваивание значения.

SvetozarPNZ 03.06.2014 12:48

Цитата:

Сообщение от ChuwY (Сообщение 1167277)
И нет. Там не перебор.

Блин, точно не перебор. А так долго выполняет... Значит, как бы я не исхищрялся, все равно быстрее, чем мгновенный доступ к свойству я не придумаю... Эх!

ChuwY 03.06.2014 12:55

Совсем не долго выполняет.
Видимо, ошибка где-то еще.
Покажите ваш код.

SvetozarPNZ 03.06.2014 12:56

Цитата:

Сообщение от elder_Nosferatu (Сообщение 1167280)
На знаю как далеко зашли в оптимизации сортировки массивов, но те методы, которые я учил на уроках информатики в школьные годы не назовешь очень быстрыми... Короче, трудовой мозоль на пятой точке подсказывает мне, что плеер быстрее найдет свойство обьекта своими методами, чем вы будете его из-под палки заставлять сортировать ничем ему не интересный массив. Да и поиск свойства осуществляется максимум полным пребором все имеющихся свойств, а сортировку массива за один проход не сделаешь :(. Плюс поиск предполагает только операцию сравнения, а сортировка - кроме сравнения еще и присваивание значения.

На хабре пописывают про методики, обгоняющие стандартные методы ActionScript.
Говоря о сортировки я не имел в виду стандартных методов. У меня немножко другой подход со схожими алгоритмами.
В программе появилась ссылка, ее нужно по алфавиту вставить в массив (не сортировать весь массив! он уже сортируется в процессе сбора ссылок). Чтобы найти место для ссылки в сортированном индексном массиве из 1 млрд элементов достаточно 40 итераций. Или, как я выше выяснил, всего 1 проверку в ассоциативном массиве.

Чтобы собрать 1 млрд ссылок, нужно проводить проверки 115 суток...:wacko:

Добавлено через 1 минуту
Цитата:

Сообщение от ChuwY (Сообщение 1167282)
Совсем не долго выполняет.
Видимо, ошибка где-то еще.
Покажите ваш код.

Код AS3:

package 
{
 
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
 
        public class Main extends MovieClip
        {
 
                var startBut;
                var links;
                var massiv;
                var massLink = [];
                var obj:Object = new Object();
                var e;
 
                public function Main()
                {
                        startBut = getChildByName('start');
                        startBut.addEventListener(MouseEvent.CLICK, writeMassiv);
 
                        links = getChildByName('links1');
                        massiv = getChildByName('massiv1');
                }
                public function writeMassiv(e)
                {
 
                        while (links.text)
                        {
                                var currentLink:String = links.text.substring(0,links.text.indexOf('\r'));
                                links.text = links.text.substr(links.text.indexOf('\r') + 1);
                                massiv.text +=  currentLink + '\r';
                                if (!obj[currentLink]) obj[currentLink] = true
                                else (trace(currentLink, '- такая ссылка есть');
                        }
                        if (! links.text)
                        {
                                trace('ссылок нет');
                        }
 
                }
        }
}


GBee 03.06.2014 13:13

Цитата:

Я уверен, что перебираются все свойства при запросе какого-то одного
Так попробуйте. Вообще-то эту схему используют, как кеш/хеш довольно часто. На 3000 свойств у меня моментально обращение проходит. Без всяких сортировок.

ChuwY 03.06.2014 13:23

Ну вы же понимаете, наверное, что в приведенном вами коде indexOf и substring кушают раз в 100 больше времени, чем поиск свойства?
А с учетом количества их вызовов...
Вот вам другой простенький тест.
(хотя тут генерация ключа более-менее жручая)

Код AS3:

package
{
        import flash.display.Sprite;
 
        public class test2 extends Sprite
        {
                private static const NUM_KEYS:int = 150000;
 
                private var _hash:Object = {};
                public function test2()
                {
                        fill();
 
                        check();                       
                }
 
                private function check():void
                {
                        for(var i : int = 0; i < NUM_KEYS; i++) {
                                var key:String = generateKey();
 
                                if(key in _hash) {
                                        trace("bingo! " + key + " exist");
                                }
                        }
                }
 
                private function fill():void
                {
                        for(var i : int = 0; i < NUM_KEYS; i++) {
                                var key:String = generateKey();
 
                                _hash[key] = true;
                        }
                }
 
                private function generateKey():String
                {
                        var key:String = "";
 
                        for(var i : int = 0; i < 3; i++) {
                                key += int(Math.random() * 100);
                        }
 
                        return key;
                }
        }
}


toFL 03.06.2014 13:48

SvetozarPNZ, запомните:
Цитата:

Вызов функции всегда дороже операторов.

SvetozarPNZ 03.06.2014 14:07

Понятно. Запомнил. Мне все равно нужно какие-то времязатратные действия производить. Буду смотреть, оптимизировать остальное.


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

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