2016-06-15 109 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这是没有错的。只是这个节点比你想要的要慢,并且有更多的开销。这只是游戏的一部分。 –