Есть ли какой-нибудь способ "приятно" выполнить JavaScript?

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

5 ответов

Я не могу думать ни о чем другом, кроме как отложить выполнение ваших расчетов. Например, разделив всю работу на маленькие части, а затем последовательно выполняя их с некоторой задержкой (используя setTimeout или же setInterval) между каждой задачей.

Создать открытые циклы... пример

Это замкнутый цикл

for( i = 0 ; i < 10000 ; i++)
{
    doSomeMath(i);
}

Это открытый цикл

i = 0;
iMax = 10000
var MyWorkingThread =
setInterval(function()
{
    if( i < iMax)
    {
       doSomeMath(i);           
       i++;
    }
    else
    {
        clearInterval(MyWorkingThread);
    }

},1);

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

Для быстрой попытки использовать один многомерный массив для хранения ваших данных, а затем в конце вашей функции используйте одно соединение для преобразования этого массива в строку для вывода и вывода этих данных с использованием метода innerHTML. Это самый быстрый способ хранения и обработки данных в JavaScript. Определенно не используйте DOM-методы или элементы для вывода ваших данных, поскольку это примерно в 4 раза медленнее.

Выведите ваши данные как можно меньше раз. Это будет зависеть от того, какое событие вы используете для выполнения своей функции. Я рекомендую не использовать событие onload, так как это замедлит начальное время загрузки вашей страницы. Я бы порекомендовал использовать функцию onclick, связанную с кнопкой, потому что тогда пользователь знает, что он вызвал выполнение, которое замедляет вашу страницу.

  1. запустить расчет на сервере с помощью запроса ajax
  2. откройте новое окно или рамку и запустите там код
  3. запустить код в цикле, разбитом на интервалы
  4. быть готовым к использованию процессов веб-работника (асинхронный скрипт html5)

Я провел некоторое тестирование, и браузеру нужно довольно много времени между перерывами в работе, чтобы быть достаточно отзывчивым:

function work(cnt) {
  // do some heavy work
  for (var i=0;i<100000000;i++) ;
  // start next work
  if (cnt > 0) {
    window.setTimeout(function(){work(cnt-1);},200);
  }
}
Другие вопросы по тегам