Является ли setInterval CPU интенсивным? - PullRequest
58 голосов
/ 11 июля 2011

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

Код проверяет изменения хэша в URL-адресе (содержимое после #) каждые 100 миллисекунд и, если он изменился, загружает страницу с помощью AJAX. Если это не изменилось, ничего не происходит. Будут ли какие-либо проблемы с процессором с этим.

Ответы [ 6 ]

57 голосов
/ 11 июля 2011

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

Однако есть способы повысить производительность, и, вероятно, целесообразно сделать это:

  1. Передайте функцию в setInterval, а не в строку.
  2. Установите как можно меньше интервалов.
  3. Сделайте интервалы максимально длинными.
  4. Каждый раз выполняйте код как можно короче и проще.

Не оптимизируйте преждевременно - не усложняйте себе жизнь, когда нет проблем.

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

14 голосов
/ 11 июля 2011

Я бы скорее сказал, что все наоборот.Правильное использование setTimeout и setInterval может значительно снизить нагрузку на процессор браузера.Например, использование setTimeout вместо цикла for или while не только снизит интенсивность использования ЦП, но и гарантирует, что браузер сможет чаще обновлять очередь пользовательского интерфейса.Поэтому долго выполняющиеся процессы не замораживают и не блокируют взаимодействие с пользователем.

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

.. и, кстати, вам не нужно проверять хэш таким образом.Для этого есть события:

onhashchange

сработает при изменении хэша.

window.addEventListener('hashchange', function(e) {
    console.log('hash changed, yay!');
}, false);
9 голосов
/ 11 июля 2011

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

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

4 голосов
/ 11 июля 2011

В терминах «интенсивная загрузка ЦП» происходит немного маркетинга.Что это действительно означает, так это «более интенсивно использует процессор, чем некоторые альтернативы».Это не «интенсивная загрузка ЦП», как в «использует всю мощь ЦП, как игра или алгоритм сжатия будет делать».

Объяснение:

Как только браузер уступил контрольон получает прерывание от базовой операционной системы и аппаратного обеспечения для получения контроля и выдачи обратного вызова JavaScript.Увеличение длительности между этими прерываниями позволяет аппаратным средствам переходить в состояния с низким энергопотреблением, что значительно снижает энергопотребление.По умолчанию операционная система Microsoft Windows и процессоры на базе Intel используют для этих прерываний разрешение 15,6 мс (64 прерывания в секунду).Это позволяет процессорам на базе Intel переходить в состояние с самым низким энергопотреблением.По этой причине веб-разработчикам традиционно удавалось достичь 64 обратных вызовов в секунду при использовании setTimeout (0) при использовании браузеров HTML4, включая более ранние выпуски Internet Explorer и Mozilla Firefox.

За последние два года браузеры пыталисьувеличить количество обратных вызовов в секунду, которые разработчики JavaScript могут получать через API-интерфейсы setTimeout и setInterval, изменяя энергосберегающие системные параметры Windows и предотвращая переход оборудования в состояние низкого энергопотребления.Спецификация HTML5 дошла до крайности, рекомендуя 250 обратных вызовов в секунду.Эта высокая частота может привести к увеличению энергопотребления на 40%, влияя на срок службы батареи, эксплуатационные расходы и окружающую среду.Кроме того, этот подход не решает проблему производительности ядра, заключающуюся в повышении эффективности процессора и планировании.

С http://ie.microsoft.com/testdrive/Performance/setImmediateSorting/Default.html

3 голосов
/ 11 июля 2011

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

Ссылка на эту ссылку О requestAnimationFrame

1 голос
/ 25 ноября 2016

Время функции> время интервала плохое, вы не можете знать, когда процессор работает, или медленно, и оно накладывается поверх текущих функций, пока компьютер не зависнет. Используйте settimeout или, что еще лучше, process.nextick, используя обратный вызов внутри settimeout.

...