【问题标题】:Is console.time() safe in node.js?node.js 中的 console.time() 安全吗?
【发布时间】:2013-02-27 04:48:03
【问题描述】:

我面前有一些 node.js 代码的 sn-p,如下所示:

console.time("queryTime");
doAsyncIOBoundThing(function(err, results) {
    console.timeEnd("queryTime");
    // Process the results...
});

当然,当我在我的(否则空闲的)开发系统上运行它时,我会收到一条很好的控制台消息,如下所示:

queryTime: 564ms

但是,如果我将其投入生产,会不会同时进行多个异步调用,并且每个调用都会覆盖前一个计时器?还是 node 有某种神奇的执行上下文,给每个“执行线程”一个单独的控制台计时器命名空间?

【问题讨论】:

  • 这不是标签的一半吗?
  • 您提出的答案是“是的,但前提是您创建了独特的标签”?
  • 我猜是的,是的;但我无法证明。 Zeta 现在已经证明了这一点,所以我会赞成这个答案。 :-)

标签: javascript node.js


【解决方案1】:

只需使用独特的标签,它就会很安全。这就是您使用标签来唯一标识开始时间的原因。

只要您不意外使用标签两次,一切都会完全按预期工作。另请注意,node 通常只有一个执行线程。

【讨论】:

  • 有趣的是(也许),您实际上可以将一个对象作为标签传递,如果您定义一个toString 方法,它将被使用并打印返回值。这与String 构造函数有关。
  • 虽然这是真的,但您将如何再次访问同一个对象?您可以使用 JSON 并 c/p 它,但是您需要维护两个对象。或者您将对象保存在变量中。但在这种情况下,您可以简单地将变量的名称用作标签……
  • @travis:但要小心:this._times[label] 的任何出现都会隐式调用您的 toString 方法。所以该方法必须是一致的(对于给定的对象,它必须每次都给出相同的结果),并且它必须是唯一的(它必须为不同的对象给出不同的结果)。所以我认为你最好只使用字符串。
【解决方案2】:

这个简单的代码行不通吗?

var labelWithTime = "label " + Date.now();
console.time(labelWithTime);
// Do something
console.timeEnd(labelWithTime);

【讨论】:

    【解决方案3】:

    考虑新的 NodeJS 功能,因为它也在发展。请查看:

    process.hrtime() & NodeJS 的其他性能 API 钩子:

    https://nodejs.org/api/perf_hooks.html#perf_hooks_performance_timing_api

    【讨论】:

      猜你喜欢
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2011-07-05
      相关资源
      最近更新 更多