あなたがお住まいの地域開発マシン上で機能の実行時間を取得する必要がある場合、あなたはどちらかのブラウザのプロファイリングツール、またはコンソールコマンドなどを使用することができるconsole.time()
とconsole.timeEnd()
。
すべての最新のブラウザーには、JavaScriptプロファイラーが組み込まれています。関数の実行時間に影響を与える可能性のある既存のコードを変更する必要がないため、これらのプロファイラーは最も正確な測定を提供する必要があります。
JavaScriptをプロファイルするには:
- ではクロム、プレスF12と選択プロファイル、そしてタブを収集する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
}
FirefoxのみがtimeEnd()
呼び出しの経過時間を返すことに注意してください。他のブラウザは単に結果を開発者コンソールに報告します:の戻り値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()
ます。
now()
ページのナビゲーションが開始されてからのミリ秒数を表す、サブミリ秒の解像度を持つdoubleです。マイクロ秒数を小数で返します(たとえば、1000.123の値は1秒で123マイクロ秒です)。
now()
単調増加しています。これは、後続の呼び出しで前方または後方にジャンプDate.getTime()
する可能性があるため、重要です。特に、OSのシステム時刻が更新された場合(原子時計の同期など)Date.getTime()
も更新されます。 now()
は常に単調に増加することが保証されているため、OSのシステム時間の影響を受けません。常に壁時計時間になります(壁時計がアトミックでないと仮定した場合...)。
now()
ほぼすべての場所で使用することができnew Date().getTime()
、+ new Date
andt Date.now()
です。例外は、Unixエポック(1970年からのミリ秒数)に基づいているようにDate
、now()
時刻が混在しないことですが、ページナビゲーションが開始されてからのミリ秒数です(したがって、ははるかに小さくなります)。Date
now()
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 +で利用できます。(私が書いた)利用可能なポリフィルもあります。