2016-06-15 107 views
3

我想寫一個記錄器(請不要評論爲什麼和「use ...」) 但我對nodejs(event?)loop/forEach感到困惑。Nodejs for循環中的延遲/中斷

作爲例子:

for(var i = 0; i<100; i++){ 
 
    process.stdout.write(Date.now().toString() + "\n", "utf8"); 
 
};

輸出爲:1466021578453,1466021578453,1466021578469,1466021578469點

的問題:當來自16ms的延遲;我怎樣才能防止呢?

編輯:Windows 7,x64; (延遲在Ubuntu 15,最大爲2ms)

+0

嘗試將輸出重定向到文件以查看是否使事情變得更快。儘管我懷疑有什麼可以做的,以防止它。至少在OS X上,由於小I/O緩衝區大小,控制檯的「stdout」可能會被阻塞,也許在Windows上也會出現類似的情況。 – robertklep

回答

0

sudo ltrace -o outlog node myTest.js

這是不是你想要更多的可能性。在我的機器上翻譯成Date.now()的電話是clock_gettime。你想看看後續調用clock_gettime之間的東西。你還寫出了STDOUT,每次你有這樣的開銷。您可以運行ltrace下的整個流程以查看發生了什麼並使用-c獲得摘要。

對我來說,它運行在3毫秒,而不是在ltrace下運行它。

% time  seconds usecs/call  calls  function 
------ ----------- ----------- --------- -------------------- 
28.45 6.629315   209  31690 memcpy 
26.69 6.219529   217  28544 memcmp 
16.78 3.910686   217  17990 free 
    9.73 2.266705   214  10590 malloc 
    2.92 0.679971   220  3083 _Znam 
    2.86 0.666421   216  3082 _ZdaPv 
    2.55 0.593798   206  2880 _ZdlPv 
    2.16 0.502644   211  2378 _Znwm 
    1.09 0.255114   213  1196 strlen 
    0.69 0.161741   215  750 pthread_getspecific 
    0.67 0.155609   209  744 memmove 
    0.57 0.133857   212  631 _ZNSo6sentryC1ERSo 
    0.57 0.133344   226  589 pthread_mutex_lock 
    0.52 0.121342   206  589 pthread_mutex_unlock 
    0.46 0.106343   207  512 clock_gettime 
    0.40 0.093022   204  454 memset 
    0.39 0.089857   216  416 _ZNSt9basic_iosIcSt11char_traitsIcEE4initEPSt15basic_streambufIcS1_E 
    0.22 0.050741   195  259 strcmp 
    0.20 0.047454   228  208 _ZNSt8ios_baseC2Ev 
    0.20 0.047236   227  208 floor 
    0.19 0.044603   214  208 _ZNSt6localeC1Ev 
    0.19 0.044536   212  210 _ZNSs4_Rep10_M_destroyERKSaIcE 
    0.19 0.044200   212  208 _ZNSt8ios_baseD2Ev 

我不知道爲什麼在那裏有31,690個memcpy和28544 memcmp。這似乎有點過分,但也許只是JIT啓動成本,至於運行成本,你可以看到512個調用clock_gettime。不知道爲什麼有那麼多的電話,但你可以看到在clock_gettime丟失106ms。祝你好運。

+0

如何解決溫斯頓這個問題? [Wisnton Output](http://pastebin.com/rfsmbQkY) [Winston Test Srouce](http://pastebin.com/XDshnadi) 我的目標是創建具有多個輸出流的記錄器,文件和控制檯 – Marc

+0

There這是沒有錯的。只是這個節點比你想要的要慢,並且有更多的開銷。這只是遊戲的一部分。 –