Есть ли какой-нибудь способ "приятно" выполнить 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, связанную с кнопкой, потому что тогда пользователь знает, что он вызвал выполнение, которое замедляет вашу страницу.
- запустить расчет на сервере с помощью запроса ajax
- откройте новое окно или рамку и запустите там код
- запустить код в цикле, разбитом на интервалы
- быть готовым к использованию процессов веб-работника (асинхронный скрипт 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);
}
}