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

2voto

gombosg Punkte 734

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];
    }
};

2voto

toondaey Punkte 404

Am besten wäre es, wenn Sie die performance hooks Modul. Obwohl es instabil ist, können Sie mark bestimmte Bereiche Ihres Codes und measure die duration zwischen markierten Bereichen.

const { performance, PerformanceObserver } = require('perf_hooks');

const measures = []

const obs = new PerformanceObserver(list => measures.push(...list.getEntries()));
obs.observe({ entryTypes: ['measure'] });
const getEntriesByType = cb => cb(measures);

const doSomething = val => {
  performance.mark('beginning of the process');

  val *= 2;

  performance.mark('after multiplication');

  performance.measure('time taken', 'beginning of the process', 'after multiplication');

  getEntriesByType(entries => {
    entries.forEach(entry => console.log(entry));
  })

  return val;
}

doSomething(4);

Versuchen Sie aquí

1voto

jose920405 Punkte 7814
export default class Singleton {

  static myInstance: Singleton = null;

  _timers: any = {};

  /**
   * @returns {Singleton}
   */
  static getInstance() {
    if (Singleton.myInstance == null) {
      Singleton.myInstance = new Singleton();
    }

    return this.myInstance;
  }

  initTime(label: string) {
    this._timers[label] = Date.now();
    return this._timers[label];
  }

  endTime(label: string) {
    const endTime = Date.now();
    if (this._timers[label]) {
      const delta = endTime - this._timers[label];
      const finalTime = `${label}: ${delta}ms`;
      delete this._timers[label];
      return finalTime;
    } else {
      return null;
    }
  }
}

InitTime bezogen auf string .

return Singleton.getInstance().initTime(label); // Returns the time init

return Singleton.getInstance().endTime(label); // Returns the total time between init and end

1voto

Yu Huang Punkte 2505

In meinem Fall ziehe ich es vor, @ grammar suger zu verwenden und mit babel zu kompilieren.
Das Problem bei dieser Methode ist, dass die Funktion innerhalb des Objekts liegen muss.

Beispiel JS-Code

function timer() {
    return (target, propertyKey, descriptor) => {
        const start = Date.now();
        let oldFunc = descriptor.value;

        descriptor.value = async function (){
            var result = await oldFunc.apply(this, arguments);
            console.log(Date.now() - start);
            return result;
        }
    }
}

// Util function 
function delay(timeout) {
    return new Promise((resolve) => setTimeout(() => {
        resolve();
    }, timeout));
}

class Test {
    @timer()
    async test(timout) {
        await delay(timout)
        console.log("delay 1");
        await delay(timout)
        console.log("delay 2");
    }
}

const t = new Test();
t.test(1000)
t.test(100)

.babelrc (für babel 6)

 {
    "plugins": [
        "transform-decorators-legacy"
    ]
 }

1voto

bvdb Punkte 18946
  1. An Start den Timer verwenden console.time("myTimer");
  2. Optional: An drucken die verstrichene Zeit, verwenden Sie console.timeLog("myTimer");
  3. Schließlich, um den Timer anhalten und drucken das Finale Mal: console.timeEnd("myTimer");

Mehr dazu erfahren Sie unter MDN und in der Node.js-Dokumentation .

Verfügbar für Chrome, Firefox, Opera und NodeJS. (nicht auf Edge oder Internet Explorer).

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