타이밍에 민감한 프로젝트를 작업하면서 아래 코드를 사용하여 Firefox의 데스크톱 컴퓨터에서 처음 사용 가능한 타이밍 이벤트의 세분성을 테스트 한 다음 Linux 서버의 node.js 코드로 테스트합니다. 파이어 폭스 실행은 1ms 타임 아웃에서 평균 200fps의 예측 가능한 결과를 산출했으며 5ms 단위의 타이밍 이벤트가 있음을 나타냅니다.node.js가 setTimeout (func, 1.0)을 잘못 처리하는 이유는 무엇입니까?
시간 초과 값 0을 사용하면 Chrome V8 엔진 Node.js가 실제로 타임 아웃을 이벤트에 위임하지 않고 즉시 처리한다는 사실을 알고 있습니다. 예상대로이 숫자는 평균 60,000fps로 CPU 용량을 지속적으로 정확하게 처리합니다 (상단에서 확인). 그러나 1ms의 타임 아웃으로 숫자는 여전히 초당 3.5-4000 사이클이었으며, Node.js는 이론상 최대 초당 1000 사이클을 생성하는 1ms 타임 아웃을 존중할 수 없음을 의미합니다. 숫자의 범위와 재생
, 내가 얻을 :
- 2ms의 : ~ 100 FPS (사실 시간 제한, 리눅스에 타이밍 이벤트의 10ms 단위 표시)
- 1.5 :
- 1.0001 같은 : 동일
- 1.0 3,500 - 4,500 FPS
- 0.99 : 2,800 - 3,600 FPS
- 0.5 : 1,100 - 2,800 FPS ,536,913,632 10
- 0.0001 : 1,800 - 3,300 FPS
- 0.0 ~ 60,000 FPS
ECMA 스크립트 사양은 아마도 실제에 전화를 위임 setTimout의 어떤 약속도하지 않습니다 때문에의 setTimeout의 동작은 (FUNC, 0), 용서할 것 OS 수준의 인터럽트. 하지만 0 < x < = 1.0에 대한 결과는 분명히 터무니 없습니다. 지연 시간을 명시 적으로 주었고 x 지연에 대한 n 번의 호출에 대한 이론상의 최소 시간은 (n-1) * x 여야합니다. V8/Node.js가하는 일은 무엇입니까? node.js api docs for setTimeout(cb, ms)
(강조 광산)에서
var timer, counter = 0, time = new Date().getTime();
function cycle() {
counter++;
var curT = new Date().getTime();
if(curT - time > 1000) {
console.log(counter+" fps");
time += 1000;
counter = 0;
}
timer = setTimeout(cycle, 1);
}
function stop() {
clearTimeout(timer);
}
setTimeout(stop, 10000);
cycle();
내가 같은데요하면 Node.js를 팀은 '최대한 빨리'을 의미하는 타임 아웃 값으로 1''사용 야생에서 코드를 관찰한다는 것입니다. 나는'setTimeout (someFunc, 0)'을 쓰는 것을 망설이는 프로그래머가 많다는 것을 알고있다. 왜냐하면'0'은 어떻게 든 '틀렸다고 느껴진다.'... 시간 제한은 0이다. '1'은 그러한 코드에서 가능한 빨리 의미하는 다음 논리적 가치로 보입니다. 그래서 Node.js 코드는 아마도'if (timeout> 1) {scheduleTimeout (someFunc, timeout);} else {scheduleNextTick (someFunc);}' –
과 같은 체크를 가지고있을 것입니다. 나는 이런 종류의 연구를 좋아합니다! –