1733 Stimmen

Messung der Zeit, die eine Funktion zur Ausführung benötigt

Ich benötige die Ausführungszeit in Millisekunden.

Ursprünglich hatte ich diese Frage bereits im Jahr 2008 gestellt. Die akzeptierte Antwort lautete damals new Date().getTime() Wir sind uns jedoch alle einig, dass die Verwendung der Standard performance.now() API ist besser geeignet. Ich ändere daher die akzeptierte Antwort in diese.

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 Knoten

21voto

Stefan Mai Punkte 22433

Verwenden Sie Firebug und aktivieren Sie sowohl Konsole als auch Javascript. Klicken Sie auf Profil. Neu laden. Klicken Sie erneut auf Profil. Sehen Sie sich den Bericht an.

9 Stimmen

Ein guter Rat, der aber offensichtlich nur für FF gilt. Wir wollen oft Browser-Geschwindigkeiten vergleichen... :-)

4 Stimmen

Bei neuen Firebuq werden diese Optionen im Menü ausgeblendet, verwenden Sie CTRL + SHIFT + P oder console.profile(); console..profileEnd()

6 Stimmen

Chrome unterstützt console.time() y console.timeEnd() auch jetzt.

16voto

Achim Koellner Punkte 861

Process.hrtime() ist verfügbar in Node.js - gibt er einen Wert in Nanosekunden zurück

var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)

1 Stimmen

Wenn Sie es lieber in ms e-3 als in die vorgeschlagene Mikrosekunde e-6 umrechnen: hrtime[0] * 1000 + hrtime[1] / 1000000 -> ja, ich benutze lieber var hrtime auch! :P

15voto

aljgom Punkte 6035

Hier ist ein Dekorateur für Timing-Funktionen

Es umschließt Funktionen so, dass sie bei jeder Ausführung zeitlich erfasst werden

let timed = (f) => (...args) => {
    let start = performance.now();
    let ret = f(...args);
    console.log(`function ${f.name} took ${(performance.now() - start).toFixed(3)}ms`);
    return ret;   
}

Verwendung:

let test = () => { /* does something */ }
test = timed(test)   // turns the function into a timed function in one line
test()               // run your code as normal, logs 'function test took 1001.900ms' 

Wenn Sie asynchrone Funktionen verwenden, können Sie die timed async und fügen Sie eine await vor f(...args), und das sollte für diese funktionieren. Es wird komplizierter, wenn ein Dekorator sowohl sync als auch async Funktionen behandeln soll.

1 Stimmen

Das ist genau das, wonach ich gesucht habe. Ich danke Ihnen!

0 Stimmen

Gibt es eine Möglichkeit, es universell zu machen, um auch mit asynchronen Funktionen zu verwenden?

1 Stimmen

Das ist großartig, jede Möglichkeit, es zu respektieren Typescript Typen?

14voto

user1032559 Punkte 1487

Es ist möglich, nur eine Variable zu verwenden:

var timer = -performance.now();

// Do something

timer += performance.now();
console.log("Time: " + (timer/1000).toFixed(5) + " sec.")

timer/1000 - zur Umrechnung von Millisekunden in Sekunden

.toFixed(5) - um zusätzliche Ziffern abzuschneiden

13voto

kayz1 Punkte 6906
var StopWatch = function (performance) {
    this.startTime = 0;
    this.stopTime = 0;
    this.running = false;
    this.performance = performance === false ? false : !!window.performance;
};

StopWatch.prototype.currentTime = function () {
    return this.performance ? window.performance.now() : new Date().getTime();
};

StopWatch.prototype.start = function () {
    this.startTime = this.currentTime();
    this.running = true;
};

StopWatch.prototype.stop = function () {
    this.stopTime = this.currentTime();
    this.running = false;
};

StopWatch.prototype.getElapsedMilliseconds = function () {
    if (this.running) {
        this.stopTime = this.currentTime();
    }

    return this.stopTime - this.startTime;
};

StopWatch.prototype.getElapsedSeconds = function () {
    return this.getElapsedMilliseconds() / 1000;
};

StopWatch.prototype.printElapsed = function (name) {
    var currentName = name || 'Elapsed:';

    console.log(currentName, '[' + this.getElapsedMilliseconds() + 'ms]', '[' + this.getElapsedSeconds() + 's]');
};

Benchmark

var stopwatch = new StopWatch();
stopwatch.start();

for (var index = 0; index < 100; index++) {
    stopwatch.printElapsed('Instance[' + index + ']');
}

stopwatch.stop();

stopwatch.printElapsed();

Ausgabe

Instance[0] [0ms] [0s]
Instance[1] [2.999999967869371ms] [0.002999999967869371s]
Instance[2] [2.999999967869371ms] [0.002999999967869371s]
/* ... */
Instance[99] [10.999999998603016ms] [0.010999999998603016s]
Elapsed: [10.999999998603016ms] [0.010999999998603016s]

leistung.jetzt() ist optional - übergeben Sie einfach false in der Konstruktorfunktion von StopWatch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X