setTimeoutが node.js でどのように実装されているかを誰かが知っているかどうか疑問に思っていました。これは V8 の一部ではないことをどこかで読んだことがあると思います。私はすぐに実装を見つけようとしましたが、ソース (BIG) でそれを見つけることができませんでした。たとえば、このtimers.jsファイルを見つけました。これは、たとえばtimer_wrap.ccにリンクしています。しかし、これらのファイルは私のすべての質問に完全に答えているわけではありません。
- V8 には
setTimeout
実装がありますか? ソースからも答えはノーだと思います。 どのように
setTimeout
実装されていますか?javascriptまたはネイティブ、または両方の組み合わせ? timers.js から、両方の線に沿って何かを想定します。var Timer = process.binding('timer_wrap').Timer;`
複数のタイマー(setTimeout)を追加する場合、node.jsは最初に実行するものをどのように認識しますか? すべてのタイマーをコレクション (ソート済み) に追加しますか? ソートされている場合、実行する必要があるタイムアウトを見つけるのは、O(1) と O(log n) の挿入ですか? しかし、再び timers.js で、リンクリストを使用していることがわかりますか?
- しかし、再び多くのタイマーを追加することはまったく問題ではありませんか?
このスクリプトを実行すると:
var x = new Array(1000), len = x.length; /** * Returns a random integer between min and max * Using Math.round() will give you a non-uniform distribution! */ function getRandomInt (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } var y = 0; for (var i = 0; i < len; i++) { var randomTimeout = getRandomInt(1000, 10000); console.log(i + ', ' + randomTimeout + ', ' + ++y); setTimeout(function () { console.log(arguments); }, randomTimeout, randomTimeout, y); }
CPU 使用率は少し高くなりますが、それほど多くはありませんか?
- パフォーマンスが向上する場合、ソートされたリストにこれらすべてのコールバックを 1 つずつ実装するかどうか疑問に思っています。