Сначала проверьте загрузчик вашего класса.
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
, если вы можете превратить свой вычислительный алгоритм во что-то, что можно назвать итеративно, вы можете временно отменить управление браузером через 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();
Вы можете попробовать выполнить длительные вычисления в потоках (см. JavaScript и Threads ), хотя они не очень переносимы.
Вы также можете попробовать использовать некоторый Javascript-профайлер для найти узкие места производительности. Firebug поддерживает профилирование javascript.
Мой опыт заключается в том, что манипуляция DOM, особенно в IE, является гораздо более важной задачей для производительности, чем «основной» JavaScript (цикл и т. д.).
Если вы строите узлы, быстрее в IE, создавая строку HTML, а затем устанавливая innerHTML в контейнере, чем используя методы DOM, такие как createElement / appendChild.
Это все еще немного кровоточит, но Firefox 3.5 имеет такие вещи, которые называются Web Workers, но я не уверен в их поддержке в других браузерах.
Mr. У Resig есть статья о них здесь: http://ejohn.org/blog/web-workers/
И симулированный отжиг , вероятно, является Простейший пример этого, если вы заметите, что вращающийся логотип Firefox не замерзает, когда рабочие потоки выполняют свои запросы (таким образом, не замораживая браузер).
Вы можете попытаться сократить код с помощью
$(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]
Использовать таймауты.
Поместив содержимое вашего цикла (ов) в отдельные функции и вызывая их из setTimeout () с тайм-аутом 50 или около того, javascript даст управление потоком и вернемся через некоторое время, позволяя пользовательскому интерфейсу получить внешний вид.
Здесь есть хорошая работа .
Некоторое время назад я писал о производительности в браузере , но позвольте мне обобщить те, которые связаны с DOM для вас здесь.
Затем некоторые из них связаны с самим JavaScript:
В моем блоге есть еще кое-что (ссылка выше).
setTimeout(pump, 0)
? Или это, возможно, сохранило бы предварительный код браузера, который реагирует на ввод мыши, обновляет метр прогресса или другие элементы DOM? – Andy 25 February 2015 в 19:18setTimeout
с 0 тоже поможет. См. Некоторые ответы на этот вопрос . – ShreevatsaR 27 March 2017 в 18:34