Zamana duyarlı bir projede çalışırken, zamanlama olaylarının ayrıntı düzeyini, önce masaüstü bilgisayarımda Firefox'ta, sonra Linux sunucumda node.js kodu olarak test etmek için aşağıdaki kodu kullandım. Firefox koşulu, 1ms zaman aşımına göre 200 fps ortalamaya ulaşan ve 5 ms'lik granüliteyle zamanlama olaylarım olduğunu gösteren tahmin edilebilir sonuçlar üretti.node.js neden setTimeout (func, 1.0) ayarını yanlış yapıyor?
Şimdi, zaman aşımı değeri 0 olarak kullanılırsa, Node.js Chrome V8 motoru temel olarak zaman aşımını bir etkinliğe devretmeyecek, ancak hemen işleyeceğini biliyorum. Beklendiği gibi, rakamlar, net olarak CPU kapasitesinde (ve üstü ile doğrulanmış) işlem gören 60.000 fps ortalamaya ulaştı. Ancak 1 ms zaman aşımı ile sayıları hala saniyede 3.5-4 bin devir() idi, bu da Node.js'nin saniyede teorik olarak maksimum 1 bin devir yaratacağı 1 ms zaman aşımına uymadığı anlamına geliyor. Bir sayı aralığı ile oynamak
, alıyorum:
- 2ms: ~ 100 fps (gerçek zaman aşımı, Linux üzerinde zamanlama olayların 10ms parçalı yapı gösteren)
- 1.5:
- 1,0001 aynı: Aynı
- 1.0: 3.500 - 4.500 fps
- 0.99: 2.800 - 3600 fps
- 0.5: 1.100 - 2.800 fps
- 0.0001: 1.800 - 3.300 fps
- 0.0: ~ 60,000 fps
ECMAScript özellikleri muhtemelen gerçek bir çağrı devretme setTimout hiç söz verir, çünkü setTimeout davranışı (işlev, 0), mazur görünmektedir OS düzeyinde kesinti. Ancak 0 < = < = 1.0 herhangi bir şeyin sonucu açıkça gülünç. Gecikmesi için belli bir süre verdim ve x gecikmesi için teorik minimum süre (n-1) * x olmalıdır. V8/Node.js ne yapıyor? node.js api docs for setTimeout(cb, ms)
(vurgu mayın) Gönderen
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();
Ne ben tahmin ediyorum node.js ekibin en kısa sürede 'anlamında bir zaman aşımı değeri olarak 1' 'kullanılan vahşi kod gözlenen olmasıdır. Programcıların (ben dahil) birçoğunun 'setTimeout (someFunc, 0) 'yazarken tereddüt ettiklerini biliyorum, çünkü' 0 'bir şekilde' yanlış geliyor 'burada ... Sıfır zaman aşımı zaman aşımı değildir. '1', bu kodda ASAP anlamına gelecek bir sonraki mantıksal değer gibi görünüyor. Bu nedenle Node.js kodunun muhtemelen bir denetimi vardır, örneğin (timeout> 1) {scheduleTimeout (bazıFunc, timeout);} else {scheduleNextTick (someFunc);} ' –
Çok ilginç bir soru BTW. Bu tür bir araştırmayı çok seviyorum! –