Как запустить длинный сценарий js, который нуждается в доступе к DOM в браузере? [Дубликат]

Сначала проверьте загрузчик вашего класса.

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

if (classLoader == null) {
    classLoader = Class.class.getClassLoader();
}

classLoader.getResourceAsStream("xmlFileNameInJarFile.xml");

// xml file location at xxx.jar
// + folder
// + folder
// xmlFileNameInJarFile.xml
52
задан William Hurst 23 March 2009 в 10:45
поделиться

7 ответов

, если вы можете превратить свой вычислительный алгоритм во что-то, что можно назвать итеративно, вы можете временно отменить управление браузером через setTimeout с коротким значением таймаута.

Например, что-то вроде этого ...

function doCalculation()
{
   //do your thing for a short time

   //figure out how complete you are
   var percent_complete=....

   return percent_complete;
}

function pump()
{
   var percent_complete=doCalculation();

   //maybe update a progress meter here!

   //carry on pumping?
   if (percent_complete<100)
   {
      setTimeout(pump, 50);
   }
}

//start the calculation
pump();
48
ответ дан Paul Dixon 19 August 2018 в 07:00
поделиться
  • 1
    Вы знаете, будет ли это работать, если вы используете setTimeout(pump, 0)? Или это, возможно, сохранило бы предварительный код браузера, который реагирует на ввод мыши, обновляет метр прогресса или другие элементы DOM? – Andy 25 February 2015 в 19:18
  • 2
    @Andy Да setTimeout с 0 тоже поможет. См. Некоторые ответы на этот вопрос . – ShreevatsaR 27 March 2017 в 18:34

Вы можете попробовать выполнить длительные вычисления в потоках (см. JavaScript и Threads ), хотя они не очень переносимы.

Вы также можете попробовать использовать некоторый Javascript-профайлер для найти узкие места производительности. Firebug поддерживает профилирование javascript.

1
ответ дан Community 19 August 2018 в 07:00
поделиться

Мой опыт заключается в том, что манипуляция DOM, особенно в IE, является гораздо более важной задачей для производительности, чем «основной» JavaScript (цикл и т. д.).

Если вы строите узлы, быстрее в IE, создавая строку HTML, а затем устанавливая innerHTML в контейнере, чем используя методы DOM, такие как createElement / appendChild.

1
ответ дан jhurshman 19 August 2018 в 07:00
поделиться

Это все еще немного кровоточит, но Firefox 3.5 имеет такие вещи, которые называются Web Workers, но я не уверен в их поддержке в других браузерах.

Mr. У Resig есть статья о них здесь: http://ejohn.org/blog/web-workers/

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

2
ответ дан leeand00 19 August 2018 в 07:00
поделиться
  • 1
    Почему веб-работники не являются ответом здесь? – Alpha G33k 14 July 2015 в 20:54
  • 2
    Ну, я ответил на это в 09 году, так что, возможно, это было не так широко использовано тогда ... – leeand00 15 July 2015 в 00:25
  • 3
    Хороший момент, ну это, безусловно, должно быть наверху. Использование setTimeout звучит для меня неловко, независимо от того, что вы делаете, если вам действительно не нужен тайм-аут для чего-то. Если вы перейдете на codepen.io в Chrome Windows прямо сейчас и выполните алгоритм с заявленной сложностью O (N!), Такой как поиск всех перестановок строки ABCDEFGHIJKLMNOP & quot; , ваш браузер закроется и перестанет отвечать на запросы. В рабочем потоке пользовательский интерфейс продолжает работать сам по себе. Это, безусловно, правильный ответ. – Alpha G33k 15 July 2015 в 02:11
  • 4
    Я отметил это для умеренности ... мы посмотрим, что произойдет. – leeand00 17 July 2015 в 14:46

Вы можете попытаться сократить код с помощью

 $(xmlDoc).find("Object").each(function(arg1) {
    (function(arg1_received) {
                setTimeout(function(arg1_received_reached) {

                    //your stuff with the arg1_received_reached goes here 

                }(arg1_received), 0)
            })(arg1)
}(this));

или для циклов «для» try

for (var i = 0 ; i < 10000 ; i = i + 1) {
    (function(arg1_received) {
        setTimeout(function(arg1_received_reached) {

            //your stuff with the arg1_received_reached goes here 

        }(arg1_received), 0)
    })(arg1_to_send)
}

У меня была та же проблема, и мои клиенты сообщали об этом как " Убить страницу ". Но теперь я получил лучшее решение для этого. :) [/ Д2]

0
ответ дан LINTUism 19 August 2018 в 07:00
поделиться

Использовать таймауты.

Поместив содержимое вашего цикла (ов) в отдельные функции и вызывая их из setTimeout () с тайм-аутом 50 или около того, javascript даст управление потоком и вернемся через некоторое время, позволяя пользовательскому интерфейсу получить внешний вид.

Здесь есть хорошая работа .

8
ответ дан Phil H 19 August 2018 в 07:00
поделиться

Некоторое время назад я писал о производительности в браузере , но позвольте мне обобщить те, которые связаны с DOM для вас здесь.

  • Обновить DOM как нечасто, насколько это возможно. Внесите свои изменения в объекты DOM в памяти и добавьте их только один раз в DOM.
  • Используйте innerHTML. Это быстрее, чем методы DOM в большинстве браузеров.
  • Используйте делегирование событий вместо обычной обработки событий.
  • Знайте, какие вызовы стоят дорого и избегайте их. Например, в jQuery значение $ ("div.className") будет дороже $ ("# someId").

Затем некоторые из них связаны с самим JavaScript:

  • Петля как можно меньше. Если у вас есть одна функция, которая собирает узлы DOM, а другая - обрабатывает их, вы выполняете цикл дважды. Вместо этого передайте анонимную функцию функции, которая собирает узлы и обрабатывает узлы по мере их сбора.
  • По возможности используйте встроенную функцию. Например, для всех итераторов.
  • Используйте setTimeout, чтобы позволить браузеру дышать раз в то время.
  • Для дорогостоящих функций, которые имеют идемпотентные выходы, кешируйте результаты, чтобы у вас не было чтобы перекомпилировать его.

В моем блоге есть еще кое-что (ссылка выше).

3
ответ дан Rakesh Pai 19 August 2018 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: