2013-03-11 11 views
12

Mam mały fragment kodu node.js przede mną, który wygląda tak:Czy plik console.time() jest bezpieczny w pliku node.js?

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

I oczywiście, gdy uruchomię to na moim (w przeciwnym razie bezczynności) systemu rozwoju, mam miłą wiadomość konsoli tak:

queryTime: 564ms 

Jednakże, jeśli kładę to do produkcji, nie będzie tam prawdopodobnie kilka asynchroniczny rozmowy w toku jednocześnie, a każdy z nich będzie nadpisać poprzednią stoper? Czy też węzeł ma jakiś magiczny kontekst wykonania, który nadaje każdemu "wątkowi wykonawczemu" osobną przestrzeń czasową konsoli?

+0

Czy to nie połowa punktu etykiety? – ruakh

+0

Czy proponujesz odpowiedź "Tak, ale tylko jeśli tworzysz unikalne etykiety"? – stickfigure

+0

Chyba tak, tak; ale nie mogłem tego udowodnić. Zeta * teraz * to udowodnił, więc po prostu przegłosuję tę odpowiedź. :-) – ruakh

Odpowiedz

24

Wystarczy użyć unikalnych etykiet i będzie to bezpieczne. Dlatego właśnie używasz etykiety, aby jednoznacznie określić czas rozpoczęcia.

Powodem tego jest dość prosta: console.time i console.timeEnd są jednym z najprostszych funkcji świata (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); 
}; 

Dopóki nie przypadkowo użyć etykiety dwukrotnie wszystko będzie działać dokładnie zgodnie z przeznaczeniem. Zauważ też, że node ma tylko jeden wątek wykonania.

+0

Ciekawe o tym (może), można faktycznie przekazać obiekt jako etykietę, a jeśli zdefiniujesz metodę 'toString', zostanie ona użyta, a zwrócona wartość zostanie wydrukowana. Ma to związek z konstruktorem 'String'. – travis

+0

Chociaż to prawda, w jaki sposób uzyskalibyście dostęp do tego samego obiektu po raz drugi? Możesz_ użyć JSON i c/p it, ale wtedy masz dwa obiekty do utrzymania. Lub zapisz obiekt w zmiennej. Ale w tym przypadku mógłbyś po prostu użyć nazwy zmiennej jako etykiety ... – Zeta

+3

@travis: Ale bądź ostrożny: każde wystąpienie 'this._times [label]' spowoduje niejawne wywołanie metody 'toString'. Tak więc ta metoda musi być spójna (dla danego obiektu musi dawać taki sam wynik za każdym razem), * i * musi być unikalna (musi dawać różne wyniki dla różnych obiektów). Więc myślę, że najlepiej będzie, jeśli użyjesz łańcuchów. – ruakh

4

Czy ten prosty kod nie działa?

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