1527

実行時間をミリ秒単位で取得する必要があります。

私が最初にこの質問をしたのは 2008 年のことでした。そのとき受け入れられた答えは、 を使用するnew Date().getTime()ことperformance.now()でした。したがって、受け入れられた回答をこれに変更しています。

4

30 に答える 30

2373

performance.now() の使用 :

var startTime = performance.now()

doSomething()   // <---- measured code goes between startTime and endTime
    
var endTime = performance.now()

console.log(`Call to doSomething took ${endTime - startTime} milliseconds`)

クラスをインポートNode.jsする必要がありますperformance

パフォーマンスのインポート

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

console.time の使用: (生活水準)

console.time('doSomething')
    
doSomething()   // <---- The function you're measuring time for 
    
console.timeEnd('doSomething')

注: およびメソッド
に渡される文字列(タイマーが期待どおりに終了するには)。time()timeEnd()

console.time()ドキュメント:

于 2009-12-29T15:05:42.183 に答える
685

new Date().getTime()を使用

getTime() メソッドは、1970 年 1 月 1 日の午前 0 時からのミリ秒数を返します。

元。

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

for (i = 0; i < 50000; ++i) {
// do something
}

var end = new Date().getTime();
var time = end - start;
alert('Execution time: ' + time);
于 2008-11-24T11:15:23.857 に答える
436

Date() を使用しないでください。以下をお読みください。

使用performance.now():

<script>
var a = performance.now();
alert('do something...');
var b = performance.now();
alert('It took ' + (b - a) + ' ms.');
</script>

それはで動作します:

  • IE10++

  • ファイアフォックス15++

  • クロム 24 ++

  • サファリ8++

  • オペラ 15 ++

  • アンドロイド 4.4++

  • などなど

console.timeあなたにとって実行可能かもしれませんが、それは非標準です§

この機能は非標準であり、標準化過程にはありません。Web に面している実稼働サイトでは使用しないでください。すべてのユーザーに対して機能するとは限りません。また、実装間に大きな非互換性がある可能性があり、将来的に動作が変更される可能性があります。

ブラウザのサポートに加えperformance.nowて、.console.time


<暴言> また、「システム時間」の変更の影響を受けるため、絶対に使用Dateないでください。つまり、ユーザーが正確なシステム時刻を持っていない場合、「負のタイミング」などの無効な結果が得られます。

2014 年 10 月、私のシステム クロックが狂ってしまい、何だと思います. そして、Gmail は Google の世界クラスのエンジニアによって構築されるべきだと思っていました....

(システム クロックを 1 年前に設定し、Gmail にアクセスして、みんなで大笑いできるようにします。おそらく、いつかJSの恥の殿堂ができるでしょうDate。)

Google スプレッドシートのnow()機能もこの問題に悩まされています。

使用する唯一の時間はDate、ユーザーシステム クロック時間を表示する場合です。時間を取得したいときや何かを測定したいときではありません。

于 2013-03-26T15:49:04.993 に答える
60

ローカルの開発マシンで関数の実行時間を取得する必要がある場合は、ブラウザーのプロファイリング ツールを使用するか、 や などのコンソール コマンドを使用できconsole.time()ますconsole.timeEnd()

最近のすべてのブラウザーには、JavaScript プロファイラーが組み込まれています。これらのプロファイラーは、関数の実行時間に影響を与える可能性がある既存のコードを変更する必要がないため、最も正確な測定値を提供するはずです。

JavaScript をプロファイリングするには:

  • ChromeF12を押して [プロファイル] タブを選択し、次に [ JavaScript CPU プロファイルを収集] を選択します。
  • Firefoxで、Firebug をインストールまたは開き、[プロファイル] ボタンをクリックします。
  • IE 9+では、 F12を押して、[スクリプト]または[プロファイラー] をクリックします (IE のバージョンによって異なります)。

または、開発マシンconsole.time()で、とを使用してコードにインストルメンテーションを追加できますconsole.timeEnd()。Firefox11+、Chrome2+、IE11+ でサポートされているこれらの関数は、 を介して開始/停止したタイマーを報告しますconsole.time()time()ユーザー定義のタイマー名を引数として取り、timeEnd()タイマーが開始してからの実行時間を報告します。

function a() {
  console.time("mytimer");
  ... do stuff ...
  var dur = console.timeEnd("myTimer"); // NOTE: dur only works in FF
}

timeEnd()呼び出しで経過時間を返すのは Firefox のみであることに注意してください。他のブラウザは単に結果を開発者コンソールに報告します: の戻り値timeEnd()は未定義です。

野生で関数の実行時間を取得したい場合は、コードを計測する必要があります。いくつかのオプションがあります。クエリを実行することで、開始時刻と終了時刻を簡単に保存できますnew Date().getTime()

function a() {
  var start = new Date().getTime();
  ... do stuff ...
  var end = new Date().getTime();
  var dur = end - start;
}

ただし、Dateオブジェクトの分解能はミリ秒のみであり、OS のシステム クロックの変更の影響を受けます。最新のブラウザには、より良いオプションがあります。

より良いオプションは、高解像度時間、別名を使用することwindow.performance.now()です。 は、2 つの重要な点でnow()従来よりも優れています。Date.getTime()

  1. now()ページのナビゲーションが開始されてからのミリ秒数を表すミリ秒未満の解像度の double です。小数部のマイクロ秒数を返します (たとえば、値 1000.123 は 1 秒と 123 マイクロ秒です)。

  2. now()単調に増加しています。後続の呼び出しで前後にジャンプDate.getTime()する可能があるため、これは重要です。特に、OS のシステム時刻が更新されると (原子時計の同期など)、Date.getTime()も更新されます。 now()は常に単調に増加することが保証されているため、OS のシステム時間の影響を受けません。これは常に壁時計の時間になります (壁時計がアトミックでないと仮定します...)。

now()new Date().getTime()+ new Dateおよびが存在するほぼすべての場所で使用できますDate.now()。例外は、unix-epoch (1970 年以降のミリ秒数) に基づいているため、Dateと のnow()時間が混在しないことです。Datenow()Date

使用方法の例を次に示しますnow()

function a() {
  var start = window.performance.now();
   ... do stuff ...
  var end = window.performance.now();
  var dur = end - start;
}

now()Chrome 安定版、Firefox 15 以降、および IE10 でサポートされています。利用可能ないくつかのポリフィルもあります。

実際の実行時間を測定するためのもう 1 つのオプションは、UserTimingです。UserTiming はconsole.time()および と同様に動作console.timeEnd()しますが、使用するのと同じ高解像度タイムスタンプをnow()利用し (したがって、サブミリ秒の単調に増加するクロックを取得します)、タイムスタンプと期間をPerformanceTimelineに保存します。

UserTiming には、マーク(タイムスタンプ) とメジャー(期間) の概念があります。いずれかを必要な数だけ定義でき、それらはPerformanceTimelineで公開されます。

タイムスタンプを保存するには、 を呼び出しますmark(startMarkName)。最初のマークからの期間を取得するには、単に を呼び出しますmeasure(measurename, startMarkname)。デュレーションは、マークと一緒に PerformanceTimeline に保存されます。

function a() {
  window.performance.mark("start");
  ... do stuff ...
  window.performance.measure("myfunctionduration", "start");
}

// duration is window.performance.getEntriesByName("myfunctionduration", "measure")[0];

UserTiming は IE10+ と Chrome25+ で利用できます。利用可能なポリフィルもあります(これは私が書いたものです)。

于 2014-01-14T19:01:22.837 に答える
21

Firebug を使用し、コンソールと Javascript の両方を有効にします。[プロファイル] をクリックします。リロードします。[プロファイル] をもう一度クリックします。レポートを表示します。

于 2008-11-24T11:14:43.297 に答える
19

簡単な解決策、ここでも add 演算子を使用できます

 var start = +new Date();
 callYourFunctionHere();
 var end = +new Date();
 var time = end - start;
 console.log('total execution time = '+ time + 'ms');
于 2018-07-02T11:56:32.487 に答える
14

process.hrtime() はNode.js内で利用可能です- ナノ秒単位で値を返します

var hrTime = process.hrtime()
console.log(hrTime[0] * 1000000 + hrTime[1] / 1000)
于 2015-03-11T09:49:04.727 に答える
10

vsync のコードをさらに拡張して、NodeJS で timeEnd を値として返すことができるようにするには、この小さなコードを使用します。

console.timeEndValue = function(label) { // Add console.timeEndValue, to add a return value
   var time = this._times[label];
   if (!time) {
     throw new Error('No such label: ' + label);
   }
   var duration = Date.now() - time;
   return duration;
};

次のようにコードを使用します。

console.time('someFunction timer');

someFunction();

var executionTime = console.timeEndValue('someFunction timer');
console.log("The execution time is " + executionTime);


これにより、より多くの可能性が得られます。実行時間を保存して、方程式で使用したり、データベースに保存したり、websocket を介してリモートクライアントに送信したり、web ページで提供したりするなど、より多くの目的に使用できます。

于 2013-08-04T04:23:45.973 に答える
6

console.timeperformance.nowはいくつかの主要なブラウザー (IE10 など) でサポートされていないため、利用可能な最良の方法を利用するスリムなユーティリティを作成しました。ただし、誤った使用 (End()初期化されていないタイマーの呼び出し) に対するエラー処理が欠けています。

それを使用して、必要に応じて改善してください。

Performance: {
    Timer: {},
    Start: function (name) {
        if (console && console.time) {
            console.time(name);
        } else if (window.performance.now) {
            this.Timer[name] = window.performance.now();
        } else {
            this.Timer[name] = new Date().getTime();
        }
    },
    End: function (name) {
        if (console && console.time) {
            console.timeEnd(name);
        } else {
            var result;
            if (window.performance.now) {
                result = window.performance.now() - this.Timer[name];
            } else {
                result = new Date().getTime() - this.Timer[name];
            }
            console.log(name + ": " + result);
        }
    }
}
于 2014-09-18T11:14:19.483 に答える
5

これはタイマー機能です。ネストされていない複数のものの間の時間を測定する場合:

function timer(lap){ 
    if(lap) console.log(`${lap} in: ${(performance.now()-timer.prev).toFixed(3)}ms`); 
    timer.prev = performance.now();
}

に似てconsole.time()いますが、以前のタイマーを追跡する必要がない場合は、より簡単に使用できます。


使用法:

timer()              // set the start
// do something 
timer('built')       // logs 'built in: 591.815ms'
// do something
timer('copied')      // logs 'copied in: 0.065ms'
// do something
timer('compared')    // logs 'compared in: 36.41ms'

の青色が気に入った場合はconsole.time()、代わりにこの行を使用できます

console.log(`${lap} in: %c${(performance.now()-timer.prev).toFixed(3)}ms`, 'color:blue');
于 2017-04-03T11:11:46.857 に答える
4

ありがとう、Achim Koellnerはあなたの答えを少し広げます:

var t0 = process.hrtime();
//Start of code to measure

//End of code
var timeInMilliseconds = process.hrtime(t0)[1]/1000000; // dividing by 1000000 gives milliseconds from nanoseconds

測定したいこと以外は何もしないでください (たとえば、console.log実行にも時間がかかり、パフォーマンス テストに影響します)。

var timeInMilliseconds = process.hrtime(t0)[1]/1000000;非同期関数の実行時間を測定するために、コールバック内に挿入する必要があることに注意してください。例えば、

var t0 = process.hrtime();
someAsyncFunction(function(err, results) {
var timeInMilliseconds = process.hrtime(t0)[1]/1000000;

});
于 2015-12-18T15:29:46.653 に答える
2

累積サイクル付きストップウォッチ

サーバーとクライアント (ノードまたは DOM) で動作し、PerformanceAPI を使用します。たとえば、1000 回呼び出された関数で 1000 個のデータ オブジェクトを処理するが、この関数の各操作の合計がどのようになるかを確認したい場合など、多くの小さなサイクルがある場合に適しています。

したがって、これはモジュールのグローバル (シングルトン) タイマーを使用します。クラス シングルトン パターンと同じで、使い方は少し簡単ですが、これを別の egstopwatch.jsファイルに入れる必要があります。

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];
    }
};
于 2019-01-28T23:17:08.993 に答える
1
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 string

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

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

于 2018-08-14T13:38:54.130 に答える
-3

前述のように、組み込みのタイマーを確認して使用します。しかし、自分で書きたい、または書く必要がある場合は、ここに私の 2 セントを示します。

//=-=|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}}}();

コンパイルは成功しました!

  • 元のサイズ: 219 バイト gzip 圧縮 (405 バイト非圧縮)
  • コンパイル済みサイズ: 109 バイト gzip 圧縮 (非圧縮 187 バイト)
  • gzip されたサイズより 50.23% 節約できました (gzip なしでは 53.83%)
于 2014-03-16T21:21:11.253 に答える
-3

You should also consider reading about bigO notation. It may be better than timing functions for understanding what is going on

于 2021-05-03T16:39:33.153 に答える