461 Stimmen

Wie kann ich die Ausführungszeit von JavaScript-Code mit Rückrufen messen?

Ich habe ein Stück JavaScript-Code, den ich mit der node.js Dolmetscher.

for(var i = 1; i < LIMIT; i++) {
  var user = {
    id: i,
    name: "MongoUser [" + i + "]"
  };
  db.users.save(user, function(err, saved) {
    if(err || !saved) {
      console.log("Error");
    } else {
      console.log("Saved");
    }
  });
}

Wie kann ich die Zeit messen, die diese Einfügeoperationen in die Datenbank benötigen? Ich könnte die Differenz der Datumswerte nach und vor diesem Codestück berechnen, aber das wäre wegen der asynchronen Natur des Codes nicht korrekt.

1voto

shpiglify Punkte 21

Ich habe dafür eine einfache Methode entwickelt, die console.time() & console.timeEnd() :

Definition der Messfunktion
function measureRunningTime(func,...args){
    const varToString = varObj => Object.keys(varObj)[0]
    const displayName = func.name || varToString({ func })
    console.time(displayName)
    func(...args)
    console.timeEnd(displayName)
}

Um sie zu verwenden, übergeben Sie eine Funktion ohne Argumente, mit gebundenen Argumenten oder mit Argumenten als folgende Parameter.

Beispiele:

Nehmen wir an, ich möchte die Laufzeit des einfachsten Suchalgorithmus - SimpleSearch - überprüfen:

gemessene Funktionsdefinition (hier Ihr Code)
const simpleSearch = (array = [1,2,3] ,item = 3) => {
    for(let i = 0; i< array.length; i++){
        if (array[i] === item) return i;
    }
    return -1
}
Implementierung ohne Argumente
measureRunningTime(simpleSearch) 
//Prints something like that-> simpleSearch: 0.04ms
Implementierung mit Argumenten mittels .bind()
const array = [1,2,3]
const item = 3
measureRunningTime(simpleSearch.bind(null, array, item))
//Prints something like that-> bound simpleSearch: 0.04ms
Implementierung mit Argumenten ohne Verwendung von .bind()
const array = [1,2,3]
const item = 3
measureRunningTime(simpleSearch, array, item)
//Prints something like that-> simpleSearch: 0.04ms

-> Diese Implementierung ist bei weitem nicht perfekt - zum Beispiel gibt es keine Fehlerbehandlung - aber sie kann verwendet werden, um die Laufzeiten von einfachen Algorithmen zu überprüfen, Außerdem bin ich kein erfahrener Programmierer, also nimm alles mit Vorsicht zu genießen.

0voto

Ighor Martins Punkte 11

Ich brauche dies, um kumulativ zu sein und um verschiedene Dinge zu messen.
Diese Funktionen gebaut:

function startMeasuring(key) {
  measureTimers[key] = process.hrtime();
}

function stopMeasuring(key) {
  if (!measures[key]) {
    measures[key] = 0;
  }

  let hrtime = process.hrtime(measureTimers[key]);
  measures[key] += hrtime[0] + hrtime[1] / 1e9;
  measureTimers[key] = null;
}

Verwendung:

startMeasuring("first Promise");
startMeasuring("first and second Promises");
await new Promise((resolve) => {
  setTimeout(resolve, 1400);
});
stopMeasuring("first Promise");
stopMeasuring("first and second Promises");

startMeasuring("first and second Promises");
await new Promise((resolve) => {
  setTimeout(resolve, 600);
});
stopMeasuring("first and second Promises");

console.log("Measure Results", measures); 
/*
Measusre Results {
  setting: 0.00002375,
  'first Promise': 1.409392916,
  'first and second Promise': 2.015160376
}
*/

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