Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прерывание в цикле, Остановка скрипта на большом кол. данных 
V
    Опции темы
MisterCleric
Дата 27.10.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: нет
Всего: 38



Привет, ребята.
Выручайте подсказкой.
Собственно суть такая:
Есть дерево на странице - комопнент Dojo Tree.
Для того, что бы его построить нужно ему отдать модель, которая парсит JSON.
Сам JSON возвращаю из сервака AJAX-ом. Ну это все умеет сам Dojo. Моя задача всего лишь отдать в респонз правильный формат.
Каждая ветка запрашивает свое содержимое сама, т.е. я не тащу все дерево целиком за раз.
Так вот: все работало отлично до тех пор, пока пользователи не напихали в одну ветку аж 10000 элементов.
И того выходит, что при открытии страницы и отрисовки корня с его чилдренами браузер просит "остановить скрипт".
Вопрос заключается в том, как его обмануть: отрисовывать усе, но при этом, что бы он не ругался?
Можно ли поставить в цикле обработки чилдренов какое-то прерывание, что бы освободить основной поток, потому как понимаю, что проблема именно в удержании основного потока выполнения.
Т.е. например, если индекс цикла == 100, то приостановиться.
А может проблема в другом?..
В общем выручайте  smile 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
IDVsbruck
Дата 27.10.2009, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 8
Всего: 22



Если просит во время eval(your_json), то тут прямыми методами не сделаешь, уже в структуру проекта надо вмешаваться.

А если при отображении (возня со структуруой), то в 100% случаев помагает оптимизация (кода, процессов, подхода), не всегда эффективно, но практика показывает, что прирост есть всегда.
Совсем недавний пример: сделал пользовательскую таблицу - передаю массив как контент, а таблица сама делает сортировку, может получать события, отдает события и выбор, присутствует анимация и т.д. - джентельменский набор. Но процесс создания был периодичным, поэтому чистота кода не соблюдалась и при небольших массивах заполнения все работало неплохо - возможно, с небольшими притормаживаниями, что списывалось на анимацию (вставка, сортинг, удаление). Но когда в таблицу был помещен массив ~200-250 строк (и всего 3 поля), процесс заморозился и тоже браузер попросил "остановить скрипт" (по-моему, ФФ тоже высказал опасения). Сделал таймер - вставка заняла около 13 секунд для ИЕ7 и около 4 секунд для ФФ 3.5. Решал вопрос исключительно оптимизацией - исключил повторное вычисление переменных и функций, минимизировал селекторы и вывел их в предпроцессы, использовал более оптимальные решения для циклов, переборов и прочих "чисто js-шных штучек". Как результат - в конечном итоге тот же скрипт в ИЕ7 стал выполняться за 0.5-0.6 секунд, ФФ менее чем за 0.4 секунды. И только за счет оптимизации кода, не трогая структуру таблицы и массива (передаваемый объект - "ассоциативный массив" - достаточно сложный - передаю в нем заголовки, контент, сплит-поля, формат полей, сортировку).

Так что, возможно, можно повозиться в твоем коде и помочь с оптимизацией.
PM MAIL   Вверх
MisterCleric
Дата 27.10.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: нет
Всего: 38



Спасибо, что я не один такой.
В большенстве своем этот код не мой, а dojo'евкий. И как оно там стрит дерево я могу посмотреть, да и поправить могу, но уж многовато его...
Я, собственно, грешу на вот это место:
Код

setChildItems: function(/* Object[] */ items){
.........
dojo.forEach(items, function(item){
                var id = model.getIdentity(item),
                    existingNode = tree._itemNodeMap[id],
                    node = 
                        ( existingNode && !existingNode.getParent() ) ?
                        existingNode :
                        this.tree._createTreeNode({
                            item: item,
                            tree: tree,
                            isExpandable: model.mayHaveChildren(item),
                            label: tree.getLabel(item)
                        });
                this.addChild(node);
                // note: this won't work if there are two nodes for one item (multi-parented items); will be fixed later
                tree._itemNodeMap[id] = node;
                if(this.tree.persist){
                    if(tree._openedItemIds[id]){
                        tree._expandNode(node);
                    }
                }
            }, this);
.......

где это цикл, а ему как раз отдаются вот те 10000 чилдренов.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
youri
Дата 27.10.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



так померяй
PM   Вверх
MisterCleric
Дата 27.10.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: нет
Всего: 38



Не понял: а что мерять?
Валится на вот этом
Код

add: function(/*Widget*/ widget){
        if(this._hash[widget.id]){
            throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered");
        }
        this._hash[widget.id]=widget;
    }


у класса dijit.WidgetSet объекта dijit.registry, который является так сказать рееестром всех живущих ныне вайджетов. Добавление в которые происходит при создании такового, что мы как раз и видем вот в том методе с циклом.


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
MisterCleric
Дата 28.10.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: нет
Всего: 38



Привет, ребята. 
В общем проблема решилась через рекурсию.
Взял размер массива, посчитал сколько будет страниц в размер 1000.
И передал в функцию индекс первой страницы.
Внутри цикл, который пробегает массив по индексам
Код


setupItemsByPage: function(items, pages, page) {
......

 var limit = page * pageSize + pageSize;
            if (limit >= items.length) {
                limit = items.length;
            }
            for (var i = page * pageSize; i < limit; i++) {
.....
}


и в конце этой функции такой вызов
Код

 var _this = this;
            setTimeout(function() {
                _this.setupItemsByPage(items, pages, ++page);
            }, 0);


Долго, конечно, но для временного решения работает. Заказчик сам виноват, что хочет в дереве видеть такое количество веток. Хотя он и сам не ожидал...
Все спасибо за то, что хоть смотрели данную тему.... 


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
youri
Дата 28.10.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



Цитата(MisterCleric @  27.10.2009,  16:04 Найти цитируемый пост)
а что мерять?

сколько времени что выполняется. Искать узкое место
PM   Вверх
mxt
Дата 29.10.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 6.9.2007

Репутация: нет
Всего: 1



вообще, нужно было использовать Firebug profile перед вызовом функции дял постройки, и искать узкое место. 
--------------------
PM MAIL   Вверх
MisterCleric
Дата 29.10.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: нет
Всего: 38



Ну посмотрел я этим профайлером.
Больше всего времени и вызовов было на методе из Dojo - buildNodeFromText
что вполне логично, так как нодов-то у меня аж 10000!!!


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0622 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.