2013-03-11 45 views
12

我有在我的面前node.js的一小段代码,看起来像这样:console.time()在node.js中安全吗?

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

当然,当我在我的(空闲的)开发系统运行它,我得到一个不错的控制台消息像这样:

queryTime: 564ms 

但是,如果我把这个投入生产,不会有可能在同时进步几个异步调用,和他们每个人都会覆盖以前的计时器?或者节点是否有某种神奇的执行上下文,使每个“执行线程”都有一个单独的控制台计时器名称空间?

+0

这不就是标签的一半吗? – ruakh 2013-03-11 20:50:27

+0

您是否提出了一个答案“是的,但只有当您创建独特的标签”? – stickfigure 2013-03-11 20:54:18

+0

我想是的,是的;但我无法证明这一点。现在泽塔*已经证明了这一点,所以我只会赞扬这个答案。 :-) – ruakh 2013-03-11 21:13:38

回答

24

只使用独特的标签,它将是安全的。这就是为什么您使用标签来唯一标识开始时间的原因。

这样做的原因很简单:console.timeconsole.timeEnd是世界上最简单的功能之一(source):

Console.prototype.time = function(label) { 
    this._times.set(label, Date.now()); 
}; 


Console.prototype.timeEnd = function(label) { 
    var time = this._times.get(label); 
    if (!time) { 
    throw new Error('No such label: ' + label); 
    } 
    var duration = Date.now() - time; 
    this.log('%s: %dms', label, duration); 
}; 

只要你不小心使用标签两次这样就可以了完全按照预期。另请注意,node通常只有一个执行线程。

+0

关于这个(也许)有趣的事情,你实际上可以传递一个对象作为标签,并且如果你定义了一个'toString'方法,它将被使用并且返回的值将被打印出来。这与'String'构造函数有关。 – travis 2013-03-11 21:14:29

+0

虽然这是事实,但您如何再次访问同一个对象?你可以使用JSON和c/p,但是你有两个对象需要维护。或者你将对象保存在一个变量中。但在这种情况下,您可以简单地将变量的名称用作标签... – Zeta 2013-03-11 21:17:32

+3

@travis:但要小心:任何出现this._times [label]的都会隐式调用您的'toString'方法。因此,该方法必须一致(对于给定的对象,它必须每次都给出相同的结果),*和*必须是唯一的(它必须为不同的对象提供不同的结果)。所以我认为你最好只使用字符串。 – ruakh 2013-03-11 21:17:43

4

难道这个简单的代码工作?

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