Есть ли какой-нибудь способ «приятно» выполнить JavaScript? - PullRequest
8 голосов
/ 24 апреля 2010

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

Ответы [ 5 ]

3 голосов
/ 24 апреля 2010

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

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

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);

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

3 голосов
/ 24 апреля 2010

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

2 голосов
/ 24 апреля 2010

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

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

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

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

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);
  }
}
...