2013-03-11 27 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);