Препятствуйте тому, чтобы длительный JavaScript запер браузер

В обычных загрузчиках классов не разрешено сканирование всех классов в пути к классам. Но обычно единственным используемым загрузчиком классов является UrlClassLoader, из которого мы можем получить список каталогов и файлов jar (см. getURLs ) и открывать их один за другим для отображения доступных классов. Этот подход, называемый сканированием пути к классу, реализован в Scannotation и Reflections .

Reflections reflections = new Reflections("my.package");
Set> classes = reflections.getSubTypesOf(Object.class);

Другой подход заключается в использовании Java Pluggable Annotation API обработки для записи обработчика аннотаций, который будет собирать все аннотированные классы во время компиляции и создавать индексный файл для использования во время выполнения. Этот механизм реализован в библиотеке ClassIndex :

// package-info.java
@IndexSubclasses
package my.package;

// your code
Iterable classes = ClassIndex.getPackageClasses("my.package");

Обратите внимание, что никакая дополнительная настройка не требуется, поскольку сканирование полностью автоматизировано благодаря компилятору Java, автоматически обнаруживающему любые процессоры, найденные в пути к классам .

55
задан William Hurst 23 March 2009 в 09:45
поделиться

6 ответов

если можно превратить алгоритм расчета во что-то, что можно назвать многократно, Вы могли выпустить управление, поддерживают браузер через короткие интервалы при помощи 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();
50
ответ дан Paul Dixon 7 November 2019 в 17:28
поделиться

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

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

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

2
ответ дан 7 November 2019 в 07:28
поделиться

По моему опыту, манипуляции с DOM, особенно в IE,

1
ответ дан 7 November 2019 в 07:28
поделиться

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

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

существует хороший workthrough здесь .

9
ответ дан Phil H 7 November 2019 в 17:28
поделиться

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

можно также попытаться использовать некоторого профилировщика JavaScript для нахождения узких мест производительности. поддержки Firebug профильный JavaScript.

1
ответ дан Community 7 November 2019 в 17:28
поделиться

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

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

Тогда существуют некоторые связанные с самим JavaScript:

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

еще существуют некоторые на моем блоге (ссылка выше).

4
ответ дан Rakesh Pai 7 November 2019 в 17:28
поделиться
Другие вопросы по тегам:

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