Как уменьшить использование процессора этого кода JavaScript? - PullRequest
0 голосов
/ 18 октября 2011

в настоящее время я оптимизирую код js.
есть функция с именем appendXYZ, и она вызывается в цикле с другими функциями.
это выглядит так:

function OuterFunc (){
  for(...){// about 150 times
     ...
     appendXYZ();
     //other dependent functions
     ...
  }
}

и теперь я почти уверен, что appendXYZ приводит к высокой загрузке процессора - он может достигать 50%,
но если я уберу эту функцию, загрузка процессора составит всего 1%.
когда загрузка процессора составляет 50%, браузер почти «завис» и страница не реагирует.
Более того, OuterFunc выполняется каждые 20 секунд, а appendXYZ из стороннего кода скрипта, и я не могу его изменить.
так как оптимизировать этот код?

Сейчас я пытаюсь использовать setTimeout, но я не знаю, работает ли он.

Ответы [ 3 ]

2 голосов
/ 18 октября 2011

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

Она может работать или не работать, и ей все равно потребуется столько же ресурсов ЦП, но она должнахотя бы немного освободите браузер.

function OuterFunc (){
  for( var i = 0; i < 150; i++ ){
     // ...
     setTimeout( appendXYZ, 0 );
     //other dependent functions
     // ...
  }
}

Опять же, это может нарушить функцию.Невозможно определить, не увидев больше кода.

Если вы передаете аргументы, вам понадобится что-то вроде:

function invoker( j ) {
   return function() {
       appendXYZ( j );
   };
}

function OuterFunc (){
  for( var i = 0; i < 150; i++ ){
     // ...
     setTimeout( invoker( i ), 0 );
     //other dependent functions
     // ...
  }
}
0 голосов
/ 18 октября 2011

Если вы ничего не можете сделать, чтобы оптимизировать реальный код, вы можете распространяться на выполнение итераций цикла, чтобы обеспечить отзывчивость браузера.Согласно статье Роберта Миллера , максимальное время, в течение которого пользователь может удерживать пользовательский интерфейс и при этом чувствовать его реагирующим на пользователя, составляет 100 миллисекунд.Чтобы узнать, как это сделать с помощью setTimeout, см. Отзывчивость пользовательского интерфейса и javascript .

0 голосов
/ 18 октября 2011

Возможно, что время выполнения OuterFunc больше, чем интервал повторения.
Другими словами, выполнение OutherFunc занимает более 20 секунд и вызывается каждые 20 секунд, что вызовет исключение stackoverflow , поскольку функция вызывается до завершения своего выполнения в бесконечном цикле.
Если вы используете setInterval для выполнения функции OuterFunc каждые 20 секунд, это можно исправить с помощью вызовов setTimeout для имитации функции setInterval:

(function helper(){
    OutherFunc();
    // after the OutherFunc is done executing, trigger it after 20 seconds
    setTimeout(helper,20);
})();

Это может помочь вам, только если setInterval является причиной зависания браузера.
Если вам это не поможет, и если вам не очень важны старые браузеры, возможно, вы могли бы реализовать своего рода « threading », используя web-worker . Таким образом, ваш код будет выполняться в разных потоках, что, безусловно, ускорит ваше приложение (a.k.a пока пока браузер зависает).

Надеюсь, это поможет!

...