Stoppuhr mit kumulativen Zyklen
Arbeitet mit Server und Client (Node oder DOM), verwendet die Performance
API. Gut, wenn Sie viele kleine Zyklen haben, z. B. in einer Funktion, die 1000 Mal aufgerufen wird und 1000 Datenobjekte verarbeitet, aber Sie wollen sehen, wie sich die einzelnen Operationen in dieser Funktion zum Gesamtwert addieren.
Dieser verwendet also einen globalen (singleton) Modul-Timer. Dasselbe wie ein Klassen-Singleton-Muster, nur ein bisschen einfacher zu verwenden, aber Sie müssen dies in einem separaten z.B. setzen. stopwatch.js
Datei.
const perf = typeof performance !== "undefined" ? performance : require('perf_hooks').performance;
const DIGITS = 2;
let _timers = {};
const _log = (label, delta?) => {
if (_timers[label]) {
console.log(`${label}: ` + (delta ? `${delta.toFixed(DIGITS)} ms last, ` : '') +
`${_timers[label].total.toFixed(DIGITS)} ms total, ${_timers[label].cycles} cycles`);
}
};
export const Stopwatch = {
start(label) {
const now = perf.now();
if (_timers[label]) {
if (!_timers[label].started) {
_timers[label].started = now;
}
} else {
_timers[label] = {
started: now,
total: 0,
cycles: 0
};
}
},
/** Returns total elapsed milliseconds, or null if stopwatch doesn't exist. */
stop(label, log = false) {
const now = perf.now();
if (_timers[label]) {
let delta;
if(_timers[label].started) {
delta = now - _timers[label].started;
_timers[label].started = null;
_timers[label].total += delta;
_timers[label].cycles++;
}
log && _log(label, delta);
return _timers[label].total;
} else {
return null;
}
},
/** Logs total time */
log: _log,
delete(label) {
delete _timers[label];
}
};
5 Stimmen
Oftmals kann eine Aussage darüber, was Sie mit der Ausführungszeit erreichen wollen, weitaus nützlicher sein als die Beantwortung der Frage allein. Heutzutage ist die Verwendung von Profiling in Firebug oder Chrome Dev-Tools oft ein viel besserer Weg, um den Code zu finden, der Ihren CPU-Saft aufsaugt.
16 Stimmen
performance.now()
funktioniert nicht in Node.new Date().getTime()
wird in Node funktionieren.2 Stimmen
@RyanWalker oder noch einfacher
Date.now()
Es funktioniert auch in Knoten2 Stimmen
@oligofren - Manchmal möchten Sie diese Daten vielleicht erfassen. Ich habe eine Situation, in der ich dies in indexedDB schreibe
1 Stimmen
Ich habe mich gefragt, gibt es ein aktuelles Dokument (z. B. in 2020/201), das besagt, dass performance.now() besser ist als Date.now() in Node?
0 Stimmen
Für eine Einzeiler die für Funktionen verwendet werden können, damit sie ihre Ausführungszeit jedes Mal protokollieren, wenn sie ausgeführt werden, sehen Sie sich auch die folgende Antwort an stackoverflow.com/a/52286301/3577695 . Sie kapselt die Zeitsteuerungslogik in einem Dekorator, um sie bei Bedarf für Funktionen zu verwenden