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

0voto

User_coder Punkte 352

Einfaches TypeScript-Beispiel, das Markierungen unterstützt. Aufruf von start('something') wird der Timer gestartet und stop('something') beendet den Timer und gibt eine formatierte Zeichenkette mit der verstrichenen Zeit zurück.

Ansicht Flems Beispiel

/**
 * Mark entries
 */
export const marks: { [id: string]: number } = {};

/**
 * Start timing 
 */
export const start = (id: string) => {
  return Object.assign(marks, {[id]: Date.now() })[id]
}

/**
 * Clear all 
 */
export const clear = () => {
  for (const id in marks) delete marks[id]; 
};

/**
 * Stop timing and return formatted elapsed time
 */
export const stop = (id: string) => {
  const ms = Date.now() - marks[id];
  delete marks[id];
  return ms > 1000 
    ? `${(ms / 1000).toFixed(0)}s ${+ms.toFixed(0).slice(1)}ms` 
    : `${ms.toFixed(0)}ms`;
};

Der Beispielcode exportiert jede Funktion. Sie können diese in ein Projekt einfügen und die Methoden entsprechend von einem Standard as importieren, z.B.:

import * as time from './timer.js'

time.start('foo')

// do something

console.log('elapsed time: ' + time.stop('bar'))

-3voto

ThorEpNorway Punkte 45

Sie sollten sich auch über die bigO-Notation informieren. Sie ist möglicherweise besser als Timing-Funktionen, um zu verstehen, was vor sich geht

5 Stimmen

Dies ist zwar für die Bestimmung und Messung der Effizienz von Funktionen usw. relevant, beantwortet aber die Frage nicht wirklich und ist eher ein Kommentar als eine Antwort.

-3voto

NlaakALD Punkte 337

Wie bereits erwähnt, sollten Sie nach einem eingebauten Timer suchen und diesen verwenden. Aber wenn Sie wollen oder müssen, um Ihre eigenen zu schreiben hier ist meine zwei Cent:

//=-=|Source|=-=//
/**
 * JavaScript Timer Object
 *
 *      var now=timer['elapsed'](); 
 *      timer['stop']();
 *      timer['start']();
 *      timer['reset']();
 * 
 * @expose
 * @method timer
 * @return {number}
 */
timer=function(){
    var a=Date.now();
    b=0;
    return{
        /** @expose */
        elapsed:function(){return b=Date.now()-a},
        start:function(){return a=Date.now()},
        stop:function(){return Date.now()},
        reset:function(){return a=0}
    }
}();

//=-=|Google Advanced Optimized|=-=//
timer=function(){var a=Date.now();b=0;return{a:function(){return b=Date.now()-a},start:function(){return a=Date.now()},stop:function(){return Date.now()},reset:function(){return a=0}}}();

Die Zusammenstellung war ein Erfolg!

  • Originalgröße: 219 Bytes gzipped (405 Bytes unkomprimiert)
  • Kompilierte Größe: 109 Bytes gzipped (187 Bytes unkomprimiert)
  • 50,23% der gezippten Größe eingespart (53,83% ohne gzip)

-7voto

Mirza Selimovic Punkte 1559

Die akzeptierte Antwort lautet falsch !

Da JavaScript asynchron ist, wären die Werte der Variablen end of the accepted answer falsch.

var start = new Date().getTime();

for (i = 0; i < 50000; ++i) {
// JavaScript is not waiting until the for is finished !!
}

var end = new Date().getTime();
var time = end - start;
alert('Execution time: ' + time); 

Die Ausführung des for kann sehr schnell sein, so dass Sie nicht sehen können, dass das Ergebnis falsch ist. Sie können es mit einem Code testen, der eine Anfrage ausführt:

var start = new Date().getTime();

for (i = 0; i < 50000; ++i) {
  $.ajax({
    url: 'www.oneOfYourWebsites.com',
    success: function(){
       console.log("success");
    }
  });
}

var end = new Date().getTime();
var time = end - start;
alert('Execution time: ' + time); 

Die Warnung wird also sehr schnell angezeigt, aber in der Konsole sehen Sie, dass die Ajax-Anfragen fortgesetzt werden.

So sollten Sie vorgehen: https://developer.mozilla.org/en-US/docs/Web/API/Performance.now

10 Stimmen

Das liegt nicht an der for-Schleife. Eine for-Schleife wartet bis zur letzten Schleife, bevor sie in Ihrem Quellcode weiterläuft. AJAX-Aufrufe sind asynchron. Und es gibt auch andere Funktionen, die asynchron ablaufen. Aber eine for-Schleife wird nicht asynchron ausgeführt.

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