JavaScript « как избавиться от зависания браузера при выполнении javascript`a?

Выполняю цикл - около 100 000 - 1 000 000 итерации.
Браузер висит.
Хочется, чтобы не висел)) и показывал прогресс бар выполнения цикла.

Как избавиться от зависания браузера при больших вычислениях на javascript?

Решение проблемы интересует в firefox`e

1 ответов


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

Спростите, как? Ну вобщем, хоть яваскрипт и однопотоковый язык, тем не менее есть возможность запускать, тем самым ускорять процесс выполнения за счет запуска нескеольких потоков с помощью setTimeout
К примеру - у нас есть SomeHugeDataArrayOrSmthngBigFat


var myData = SomeHugeDataArrayOrSmthngBigFat;
// Да, детка, я большой долбанный массив!
var length = myData.length;
var index = 0;
var process = function() {
  for (; index < length; index++) {
    var toProcess = myData[index];
    // Че-нить делаем тут
    if (index + 1 < length && index % 100 == 0) {
        setTimeout(process, 5);
    }
  }
};
process();
 

Данная операция несколько ускоряет разбор большого количетсва данных в разы примерно равные количеству запущенных процессов с помощью sertTimeOut.

Примерно так.
Надеюсь, помогло.

Достаточно универсальное решение проблемы обработки больших массивов: http://w3pro.ru/article/obrabotka-bolshikh-obemov-dannykh-v-javascript - программистом задается функция, которая применяется к каждому элементу массива, максимальное время выполнения обработки порции массива и задержка между обработками.


setInterval