Nodejs delay/interrupt 在 for 循环中

Nodejs delay/interrupt in for loop

我想写一个记录器(请不要评论为什么和"use ...") 但是我对nodejs(事件?)感到困惑loop/forEach。

例如:

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

output as: 1466021578453, 1466021578453, 1466021578469, 1466021578469

问题:Delay从哪里来的16ms;我该如何预防?

编辑:Windows 7,x64; (延迟 Ubuntu 15,最大 2 毫秒)

sudo ltrace -o outlog node myTest.js

这可能超出您的预期。调用 Date.now() 在我的机器上转换为 clock_gettime。您想查看对 clock_gettime 的后续调用之间的内容。您还写出到 STDOUT,每次这样做都会产生开销。您可以 运行 ltrace 下的整个过程以查看发生了什么并使用 -c 获得摘要。

对我来说,如果不在 ltrace 下 运行ning,它会在 3 毫秒内 运行s。

% 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 中丢失了 106 毫秒。祝你好运。