[解決済み] NodeJS - setTimeout(fn,0) vs setImmediate(fn)
質問
この2つの違いは何ですか?また、どのような場合にどちらを使うのでしょうか?
どのように解決するのですか?
setTimeout は、単に遅延が終了した後に関数を呼び出すようなものです。関数が呼ばれるときはいつでも、それはすぐに実行されませんが、実行中で、現在キューに入っているすべてのeventhandlerが最初に終了した後に実行されるようにキューに入れられます。それがどれくらい長くかかるかについての保証はありません。
setImmediate は、関数のキューを使わないことを除けば、この点で似ています。それはI/Oイベントハンドラのキューをチェックします。もし現在のスナップショット内のすべてのI/Oイベントが処理されたなら、コールバックを実行します。これは、process.nextTickのように、最後のI/Oハンドラの直後にそれらをキューに入れます。だから、より高速です。
また、(setTimeout,0)は実行前に少なくとも一度はタイマーをチェックするため、遅くなります。時には2倍遅くなることもあります。以下はベンチマークです。
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が他の半分の回数呼ばれるかどうか、自分で確認することができます。また、setImmediateはファイルシステムの呼び出しに応じて調整されることを忘れないでください。そのため、負荷がかかるとパフォーマンスが低下します。私は、setTimeoutがより良いことができるとは思わない。
setTimeoutは、ある時間経過後に関数を呼び出すための邪魔にならない方法です。ちょうどブラウザにあるようなものです。サーバーサイドには向かないかもしれません(なぜ私がsetTimeoutではなくbenchmark.jsを使用したかを考えてみてください)。
関連
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] package.jsonのチルダ(~)とキャレット(^)の違いは何ですか?
-
[解決済み] とは何ですか! (not not)演算子とは何ですか?
-
[解決済み] callとapplyの違いは何ですか?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】setImmediateとnextTickの比較
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] javascript の関数から `undefined` と `null` のどちらを返すのが良いのでしょうか?
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] AJAX Mailchimp サインアップフォームの統合
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?