2014-09-02 2 views
0

나는 같은 Node.js를 코드의 비트 : 내 컴퓨터에서 실행하면 이상한setTimeout이 이전보다 빨리 실행되는 이유는 무엇입니까?

var start = Date.now(); 

setTimeout(function() { 
    console.log(Date.now() - start); 
    for (var i = 0; i < 100000; i++) { 
    } 
}, 1000); 

setTimeout(function() { 
    console.log(Date.now() - start); 
}, 2000); 

뭔가가 발생합니다. 내가 얻은 시간은 970 ~ 980 사이이고 1970 ~ 1980 사이입니다. 왜 타임 아웃 시간보다 빠른 시간이 있습니까?

+2

어떤 브라우저에서 볼 수 있습니까? Safari는 Chrome 및 Firefox와 비슷한 1002 및 2001과 같은 숫자를 반환합니다. – RobG

+0

우선 'for' 루프를 제거해야합니다. JS에서 이와 같은 구문을 사용하는 것은 결코 좋은 생각이 아닙니다. JS에서 'sleep'함수에 해당하는 것은 없으며, 그러한 장기 실행 루프를 사용하여 유사한 효과를 만들려고 시도하는 것은 거의 모든 경우에 예측할 수 없거나 신뢰할 수없는 결과를 초래하는 말도 안되는 말입니다. – CBroe

+0

나는 각각 1002와 2002를 얻는다. –

답변

1

는 :

당신의 콜백이 아마 정확히 밀리 초 지연에 를 호출되지 않습니다 것이 중요합니다

- Node.js를가의 정확한 타이밍에 대해 보증하지 않습니다 콜백이 시작되고 주문 번호 이 실행되지 않습니다. 콜백은 가능한 한 가까운 에 지정된 시간까지 호출됩니다.
https://www.npmjs.org/package/nanotimer

일부 관련 질문 : 그러나

+, 내가 생각

그러나, 함께 플레이 할 수있는 nanotimer이있다 /- 삼 0ms 일찍 조금 (대부분의 브라우저에 비해 난 놀았 어, 그들은 일반적으로보다 10ms (만큼 CPU가 밖으로 최대되지 않습니다))보다.

2

Date 정밀도 때문에 이러한 문제가 발생했다고 생각합니다. 플랫폼 및 브라우저에 따라 다를 수 있습니다.

Here 님의 날짜 정확도에 대한 자세한 내용입니다.

일부 플랫폼에는 고정밀 타이머 타이머 available이 더 많이 있지만 믹스 앤 매치 (사용 가능한 것을 찾아 그에 따라 회귀해야 함)가 자주 발생합니다. Node.js를 setTimeOutdocumentation에서

관련 문제