programing

노드JS - setTimeout(fn,0) vs setImediate(fn)

cafebook 2023. 8. 21. 21:37
반응형

노드JS - setTimeout(fn,0) vs setImediate(fn)

그 둘의 차이점은 무엇이며, 언제 하나를 다른 하나보다 더 사용합니까?

setTimeout은 단순히 지연이 완료된 후 함수를 호출하는 것과 같습니다.함수를 호출할 때마다 해당 함수는 즉시 실행되지 않고 모든 실행 및 현재 대기 중인 이벤트 처리기가 먼저 완료된 후에 실행되도록 대기열에 저장됩니다. setTimeout(,0)은 기본적으로 현재 대기열에 있는 모든 현재 함수가 실행된 후에 실행됨을 의미합니다.시간이 얼마나 걸릴지 장담할 수 없습니다.

setImediate는 함수의 큐를 사용하지 않는다는 점을 제외하면 이 점에서 유사합니다.I/O 이벤트 처리기의 대기열을 확인합니다.현재 스냅샷의 모든 I/O 이벤트가 처리되면 콜백이 실행됩니다.마지막 I/O 처리기 직후에 프로세스.nextTick과 같은 큐에 들어갑니다.그래서 더 빠릅니다.

또한 (setTimeout,0)은 실행하기 전에 타이머를 한 번 이상 확인하기 때문에 느려집니다.때로는 속도가 두 배 더 느릴 수 있습니다.여기 벤치마크가 있습니다.

var Suite = require('benchmark').Suite
var fs = require('fs')

var suite = new Suite

suite.add('deffered.resolve()', function(deferred) {
  deferred.resolve()
}, {defer: true})

suite.add('setImmediate()', function(deferred) {
  setImmediate(function() {
    deferred.resolve()
  })
}, {defer: true})

suite.add('setTimeout(,0)', function(deferred) {
  setTimeout(function() {
    deferred.resolve()
  },0)
}, {defer: true})

suite
.on('cycle', function(event) {
  console.log(String(event.target));
})
.on('complete', function() {
  console.log('Fastest is ' + this.filter('fastest').pluck('name'));
})
.run({async: true})

산출량

deffered.resolve() x 993 ops/sec ±0.67% (22 runs sampled)
setImmediate() x 914 ops/sec ±2.48% (57 runs sampled)
setTimeout(,0) x 445 ops/sec ±2.79% (82 runs sampled)

첫 번째는 가능한 가장 빠른 통화를 알려줍니다.setTimeout이 다른 것보다 절반 이상 호출되면 자신을 확인할 수 있습니다.또한 즉시 파일 시스템 호출에 적응하도록 설정합니다.따라서 부하가 걸리면 성능이 저하됩니다.setTimeout이 더 좋을 것 같지는 않습니다.

setTimeout은 시간이 지나면 함수를 호출하는 비침입적인 방법입니다.그것은 브라우저에 있는 것과 같습니다.서버 측에는 적합하지 않을 수 있습니다(benchmark.js not setTimeout을 사용한 이유를 생각해 보십시오).

이벤트 루프가 작동하고 일부 오해를 해소하는 방법에 대한 훌륭한 기사입니다.http://voidcanvas.com/setimmediate-vs-nexttick-vs-settimeout/

기사 인용:

setImmediate콜백은 I/O 큐 콜백이 완료되거나 시간 초과된 후에 호출됩니다. 설정즉시 콜백은 체크 큐에 배치되며, 이는 I/O 큐 이후에 처리됩니다.

setTimeout(fn, 0)콜백은 타이머 큐에 배치되며 I/O 콜백 및 큐 확인 콜백 후에 호출됩니다.이벤트 루프로서 각 반복에서 타이머 큐를 먼저 처리하여 어떤 것이 먼저 실행될 것인지는 어떤 단계의 이벤트 루프인지에 따라 달라집니다.

setImediate()는 I/O 이벤트 콜백 후 setTimeout 및 setInterval 전에 콜백의 즉시 실행을 예약하는 것입니다.

setTimeout()은 지연 시간(밀리초) 후 일회성 콜백 실행을 예약하는 것입니다.

서류에는 이렇게 적혀 있습니다.

setTimeout(function() {
  console.log('setTimeout')
}, 0)

setImmediate(function() {
  console.log('setImmediate')
})

위의 코드를 실행하면 결과는 다음과 같습니다.현재 문서에서 "I/O 이벤트 콜백 후 및 setTimeout 및 setInterval 전에 콜백의 "즉시" 실행을 예약하려면" ...

결과..

제한 시간 설정

즉시 설정

예제를 다른 타이머로 감으면 항상 setImmediate와 setTimeout이 차례로 출력됩니다.

setTimeout(function() {
  setTimeout(function() {
    console.log('setTimeout')
  }, 0);
  setImmediate(function() {
    console.log('setImmediate')
  });
}, 10);

항상사는하를 사용합니다.setImmediate 당신이 로 필요하다고 , 당신은 그것이 필요합니다.setTimeout(,0)(하지만 무엇 때문인지 상상조차 할 수 없습니다.)setImmediate콜백은 거의 항상 이전에 실행됩니다.setTimeout(,0)첫 번째 체크 인과 인이 호출될 때를 제외하고.setImmediatecallback).

Navya S의 답이 틀린 것 같습니다. 여기 제 테스트 코드가 있습니다.

let set = new Set();

function orderTest() {
  let seq = [];
  let add = () => set.add(seq.join());
  setTimeout(function () {
    setTimeout(function () {
      seq.push('setTimeout');
      if (seq.length === 2) add();
    }, 0);

    setImmediate(function () {
      seq.push('setImmediate');
      if (seq.length === 2) add();
    });
  }, 10);
}

// loop 100 times
for (let i = 0; i < 100; i++) {
  orderTest();
}

setTimeout(() => {
  // will print one or two items, it's random
  for (item of set) {
    console.log(item);
  }
}, 100);

설명은 여기에 있습니다.

setTimeout(fn,0)은 대규모 업데이트에서 브라우저가 중지되는 것을 방지하는 데 사용할 수 있습니다.예를 들어 websocket.onmessage에서는 html이 변경될 수 있으며, 메시지가 계속 오면 setImidiate를 사용할 때 브라우저가 정지될 수 있습니다.

이를 깊이 이해하기 위해 이벤트 루프 단계를 한 번 더 진행하십시오.

즉시 설정:"확인" 단계에서 실행됩니다.확인 단계는 I/O 단계 이후에 호출됩니다.

시간 초과 설정:타이머 단계에서 실행됩니다.타이머 단계는 첫 번째 단계이지만 I/O 단계와 Check 단계 이후에 호출됩니다.

결정론적인 방식으로 출력을 얻으려면 이벤트 루프가 어떤 단계인지에 따라 달라집니다. 따라서, 우리는 두 가지 중에서 함수를 사용할 수 있습니다.

Javascript 엔진이 실행을 시작하면 코드를 한 줄씩 확인합니다.

setTimeout(function() {
  console.log('setTimeout')
}, 0)

setImmediate(function() {
  console.log('setImmediate')
})

에 관한 한

settimeout호출 스택에서 호출 대기열로 이동하고 실행을 위한 타이머를 시작합니다.

setimmediate 스택에서 매크로 번째 루프가된 후 으로 이동합니다.

그래서 만약에settimeout값은 0입니다. 호출 스택 루프가 완료되기 전에 타이머가 완료됩니다.

그런 거야, 래서settimeout 앞에 됩니다.setimmediate.

자, 이제

setTimeout(function() {
  setTimeout(function() {
    console.log('setTimeout')
  }, 0);
  setImmediate(function() {
    console.log('setImmediate')
  });
}, 10);

즉, 첫 번째 기본 시간 초과는 콜 대기열로 이동하고, 반면 콜 스택은 실행을 완료합니다.

콜스택에 을 하게 됩니다.setimmediate콜 스택이 이미 작업을 실행할 수 있기 때문입니다.

이벤트 루프를 차단하지 않으려면 setImediate()를 사용합니다.콜백은 현재 이벤트가 완료되는 즉시 다음 이벤트 루프에서 실행됩니다.

제어된 지연에 대해 setTimeout()을 사용합니다.이 기능은 지정된 지연 후에 실행됩니다.최소 지연 시간은 1밀리초입니다.

언급URL : https://stackoverflow.com/questions/24117267/nodejs-settimeoutfn-0-vs-setimmediatefn

반응형