Program Club

setInterval CPU 집약적입니까?

proclub 2020. 12. 8. 20:13
반응형

setInterval CPU 집약적입니까?


setInterval이 CPU를 많이 사용하는 곳을 읽었습니다. setInterval을 사용하는 스크립트를 만들고 CPU 사용량을 모니터링했지만 변경 사항을 알지 못했습니다. 내가 놓친 것이 있는지 알고 싶습니다.

코드가하는 일은 100 밀리 초마다 URL (# 이후 내용)의 해시 변경 사항을 확인하고 변경된 경우 AJAX를 사용하여 페이지를로드하는 것입니다. 변경되지 않은 경우 아무 일도 일어나지 않습니다. 그것에 CPU 문제가 있습니까?


나는 setInterval본질적으로 중대한 성능 문제를 일으킬 것이라고 생각하지 않습니다 . CPU가 덜 강력했던 초기 시대에서 명성이 올 수 있다고 생각합니다.

그러나 성능을 향상시킬 수있는 방법이 있으며 다음과 같이하는 것이 현명 할 것입니다.

  1. setInterval문자열이 아닌에 함수를 전달하십시오 .
  2. 가능한 한 적은 간격을 설정하십시오.
  3. 간격 기간을 가능한 한 길게 만드십시오.
  4. 가능한 한 짧고 간단하게 코드를 실행하십시오.

너무 일찍 최적화하지 마십시오. 문제가 없을 때 스스로 삶을 어렵게 만들지 마십시오.

그러나 특정 경우에 할 수있는 한 가지는 onhashchange이벤트를 지원하는 브라우저에서 시간 초과가 아닌 이벤트 를 사용하는 것입니다.


차라리 그 반대라고 말하고 싶습니다. 사용 setTimeoutsetInterval브라우저의 CPU 사용량을 줄이기 drastical, 수 올바르게. 예를 들어 또는 루프 setTimeout를 사용하는 대신 사용하면 CPU 사용량이 줄어들뿐만 아니라 브라우저가 UI 대기열을 더 자주 업데이트 할 수 있습니다. 따라서 오래 실행되는 프로세스는 사용자 경험을 멈추거나 잠그지 않습니다.forwhile

그러나 일반적으로 setInterval사이트에서 정말 많이 사용 하면 속도가 느려질 수 있습니다. 다소 무거운 작업과 함께 20 개의 동시 실행 인터벌이 쇼에 영향을 미칩니다. 그리고 다시 .. 당신은 정말로 문제가 아닌 부분을 엉망으로 만들 수 있습니다 setInterval.

.. 그런데 해시를 확인할 필요가 없습니다. 이에 대한 이벤트가 있습니다.

onhashchange

해시가 변경되면 실행됩니다.

window.addEventListener('hashchange', function(e) {
    console.log('hash changed, yay!');
}, false);

아니요, setIntervalCPU 집약적이지 않습니다. 당신은 매우 짧은 사이클 (또는 적당히 긴 간격으로 실행하는 매우 복잡한 작업)에서 실행 간격을 많이 가지고 있다면, 그것은 쉽게 그들이 그 일을 정확히 당신의 간격이하고있는 빈도에 따라 CPU를 많이 될 수 있습니다.

간격에서 100 밀리 초마다 URL을 확인하는 데 문제가있을 것으로 예상하지 않지만 개인적으로 간격을 250 밀리 초로 늘릴 것입니다. 두 사람의 차이가 일반적인 사람에게 눈에 띄지 않을 것이라고 예상하기 때문입니다. 일반적으로, 특히 대부분의 시간 동안 작동하지 않을 것으로 예상되는 작업에 대해 내가 벗어날 수 있다고 생각하는 가장 긴 시간 제한 간격을 사용하려고하기 때문입니다.


"CPU 집약적"이라는 용어로 약간의 마케팅이 진행되고 있습니다. 실제로 의미하는 것은 "일부 대안보다 CPU 집약적"입니다. "게임이나 압축 알고리즘처럼 많은 CPU 성능을 사용"하는 것처럼 "CPU 집약적"이 아닙니다.

설명 :

브라우저가 제어권을 얻은 후에는 기본 운영 체제 및 하드웨어의 인터럽트에 의존하여 제어를 받고 JavaScript 콜백을 발행합니다. 이러한 인터럽트 사이의 지속 시간이 길면 하드웨어가 저전력 상태로 전환되어 전력 소비를 크게 줄일 수 있습니다. 기본적으로 Microsoft Windows 운영 체제 및 Intel 기반 프로세서는 이러한 인터럽트에 대해 15.6ms 해상도를 사용합니다 (초당 64 개 인터럽트). 이를 통해 Intel 기반 프로세서는 최저 전력 상태로 들어갈 수 있습니다. 이러한 이유로 웹 개발자는 이전 버전의 Internet Explorer 및 Mozilla Firefox를 포함하는 HTML4 브라우저를 사용할 때 setTimeout (0)을 사용할 때 전통적으로 초당 64 개의 콜백 만 달성 할 수있었습니다.

지난 2 년 동안 브라우저는 전원을 의식하는 Windows 시스템 설정을 변경하고 하드웨어가 저전력 상태로 들어가는 것을 방지하여 JavaScript 개발자가 setTimeout 및 setInterval API를 통해 수신 할 수있는 초당 콜백 수를 늘리려 고 시도했습니다. HTML5 사양은 초당 250 개의 콜백을 권장하는 극한의 수준에 도달했습니다. 이러한 고주파는 전력 소비를 40 % 증가시켜 배터리 수명, 운영 비용 및 환경에 영향을 미칠 수 있습니다. 또한이 접근 방식은 CPU 효율성 및 스케줄링 향상이라는 핵심 성능 문제를 해결하지 못합니다.

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


귀하의 경우에는 문제가 없습니다. 그러나 캔버스에서 거대한 애니메이션을 수행하거나 webgl로 작업하는 경우 CPU 문제가 있으므로 requestAnimationFrame을 사용할 수 있습니다.

이 링크를 참조하십시오 requestAnimationFrame 정보


기능 시간> 간격 시간이 나쁘면 CPU가 딸꾹질하거나 느린 시점을 알 수 없으며 PC가 멈출 때까지 진행중인 기능 위에 쌓입니다. settimeout 내에서 콜백을 사용하여 settimeout 또는 더 나은 process.nextick을 사용하십시오.

참고 URL : https://stackoverflow.com/questions/6650134/is-setinterval-cpu-tens

반응형