この記事では『JavaScriptのパフォーマンスを計測する方法』について
- performance.markとperformance.measureを用いてパフォーマンスを計測する方法
- performance.markとは
- performance.measureとは
などを分かりやすく説明するように心掛けています。ご参考になれば幸いです。
performance.markとperformance.measureを用いてパフォーマンスを計測する方法
performance.mark
メソッドとperformance.measure
メソッドを用いることで、JavaScriptのパフォーマンス(処理時間)を計測することができます。
JavaScriptのパフォーマンスを計測する手順を以下に示します。
パフォーマンスを計測する手順
performance.mark
メソッドを用いて、マークを作成する。performance.measure
メソッドを用いて、2つのマーク間の時間を測定する。- 測定結果を取得する。
以下に、これらの手順を実装した簡単なプログラム例を示します。
// 「start」という名前のマークを作成
performance.mark('start');
// 測定対象の処理(今回は単純なfor文)
let total = 0;
for (let i = 0; i < 1000000; i++) {
total++;
}
console.log('total: ' + total);
// 「end」という名前のマークを作成
performance.mark('end');
// 2つのマーク間の時間を測定
performance.measure(
'processing time', // 測定名
'start', // 測定開始のマーク名
'end' // 測定終了のマーク名
);
// 測定結果を取得(「測定名」を用いて取得)
const results = performance.getEntriesByName('processing time')
// 測定結果の表示
console.log('processing time: ' + results[0].duration + '[ms]')
// ログ
// total: 1000000
// processing time: 6.335099995136261[ms]
上記のプログラムではまず、performance.mark
メソッドを用いてstart
という名前のマークを作成します。このマークは測定開始点を示します。次に、測定対象となる処理を実行します。今回は、単純なforループを用いています。この処理の後に、performance.mark
メソッドを用いてend
という名前のマークを作成します。このマークは測定終了点を示します。
次に、performance.measure
メソッドを用いて、2つのマーク間の時間を測定します。performance.measure
メソッドには、「測定名」「測定開始のマーク名」「測定終了のマーク名」を設定します。
最後に、performance.measure
メソッドでの測定結果を取得します。測定結果の取得には様々な方法がありますが、ここでは、performance.getEntriesByName
メソッドを用いて測定結果を取得します。performance.getEntriesByName
メソッドの引数には、performance.measure
メソッドで指定した「測定名」を入力します。
では次に、performance.markメソッドとperformance.measureメソッドについてもう少し詳しく説明します。
performance.markとは
performance.markメソッドはマークを作成し、それをパフォーマンスエントリとして保存するメソッドです。
performance.mark
メソッドの構文を以下に示します。
performance.markメソッドの構文
performance.mark(name)
- 引数name
- 作成するマークの名前を文字列型で指定します。
performance.mark
メソッドは、PerformanceMarkオブジェクトを作成します。PerformanceMarkオブジェクトは以下のようなプロパティを持っています。
PerformanceMarkオブジェクト
- name
- マークの名前です。
performance.mark
メソッドで設定した名前です。
- マークの名前です。
- entryType
- パフォーマンスエントリの種類です。
performance.mark
メソッドの場合、「mark」になります。
- パフォーマンスエントリの種類です。
- startTime
- ページのナビゲーション開始(すなわちページロード)からの経過時間(ミリ秒)です。
performance.mark
メソッドが呼び出された時点のタイムスタンプになります。
- duration
- この種類のパフォーマンスエントリでは常に
0
です。
- この種類のパフォーマンスエントリでは常に
- detail
- この種類のパフォーマンスエントリでは常に
null
です。
- この種類のパフォーマンスエントリでは常に
PerformanceMarkオブジェクトはperformance.getEntriesByName
メソッドやperformance.getEntriesByType
メソッドやperformance.getEntries
メソッドを用いて取得することができます。
performance.getEntriesByNameメソッドでPerformanceMarkオブジェクトを取得する
performance.getEntriesByName('start')
と記述すれば、start
という名前のマークのPerformanceMarkオブジェクトを取得します。言い換えると、PerformanceMarkオブジェクトのname
プロパティがstart
であるものを全て取得します。
// 「start」と「end」という名前のマークを作成
performance.mark('start');
performance.mark('end');
// 「start」という名前のマークのPerformanceMarkオブジェクトを取得(取得するのはオブジェクトの配列)
let entries = performance.getEntriesByName('start');
// PerformanceMarkオブジェクトを表示(オブジェクトの配列)
console.log(entries);
// ログ
// [
// PerformanceMark {
// name: 'start',
// entryType: 'mark',
// startTime: 37.22970002889633,
// duration: 0,
// detail: null
// }
// ]
// PerformanceMarkオブジェクト配列の0番目の要素を表示(オブジェクト)
console.log(entries[0]);
// ログ
// PerformanceMark {
// name: 'start',
// entryType: 'mark',
// startTime: 37.22970002889633,
// duration: 0,
// detail: null
// }
performance.getEntriesByTypeメソッドでPerformanceMarkオブジェクトを取得する
performance.getEntriesByType('mark')
と記述すれば、performance.mark
メソッドで作成したPerformanceMarkオブジェクトを全て取得します。
// 「start」と「end」という名前のマークを作成
performance.mark('start');
performance.mark('end');
// PerformanceMarkオブジェクトを全て取得(取得するのはオブジェクトの配列)
let entries = performance.getEntriesByType('mark');
// PerformanceMarkオブジェクトを全て表示(オブジェクトの配列)
console.log(entries);
// ログ
// [
// PerformanceMark {
// name: 'start',
// entryType: 'mark',
// startTime: 39.00209999084473,
// duration: 0,
// detail: null
// },
// PerformanceMark {
// name: 'end',
// entryType: 'mark',
// startTime: 39.135999977588654,
// duration: 0,
// detail: null
// }
// ]
// PerformanceMarkオブジェクト配列の0番目の要素を表示(オブジェクト)
console.log(entries[0]);
// ログ
// PerformanceMark {
// name: 'start',
// entryType: 'mark',
// startTime: 39.00209999084473,
// duration: 0,
// detail: null
// }
performance.getEntriesメソッドでPerformanceMarkオブジェクトを取得する
performance.getEntries()
と記述すれば、performance.mark
メソッドで作成したPerformanceMarkオブジェクトとperformance.measure
メソッドで作成したPerformanceMeasureオブジェクトを全て取得します。
// 「start」と「end」という名前のマークを作成
performance.mark('start');
performance.mark('end');
// PerformanceMarkオブジェクトとPerformanceMeasureオブジェクトを全て取得(取得するのはオブジェクトの配列)
let entries = performance.getEntries();
// PerformanceMarkオブジェクトとPerformanceMeasureオブジェクトを全て表示(オブジェクトの配列)
console.log(entries);
// ログ
// [
// PerformanceMark {
// name: 'start',
// entryType: 'mark',
// startTime: 36.79409998655319,
// duration: 0,
// detail: null
// },
// PerformanceMark {
// name: 'end',
// entryType: 'mark',
// startTime: 36.9297000169754,
// duration: 0,
// detail: null
// }
// ]
// PerformanceMarkオブジェクトとPerformanceMeasureオブジェクトの配列の0番目の要素を表示(オブジェクト)
console.log(entries[0]);
// ログ
// PerformanceMark {
// name: 'start',
// entryType: 'mark',
// startTime: 36.79409998655319,
// duration: 0,
// detail: null
// }
performance.measureとは
performance.measureメソッドは2つのマーク間の時間を測定するメソッドです。
performance.measure
メソッドの構文を以下に示します。
performance.measureメソッドの構文
performance.measure(measureName, startMark, endMark)
- 引数は全て文字列型です。
- 引数measureName
- 測定名を指定します。
- 引数startMark
- 作成したマーク名を指定します(省略可能)。
performance.mark
メソッドで指定した名前と同じにする必要があります。- 省略した場合、開始から現在までの経過時間が測定されます。
- 引数endMark
- 作成したマーク名を指定します(省略可能)。
- performance.markメソッドで指定した名前と同じにする必要があります。
- 省略した場合、引数
startMark
から現在までの経過時間が測定されます。
performance.measure
メソッドは、PerformanceMeasureオブジェクトを作成します。PerformanceMeasureオブジェクトは以下のようなプロパティを持っています。
PerformanceMeasureオブジェクト
- name
- 測定名です。performance.measureメソッドで設定した名前です。
- entryType
- パフォーマンスエントリの種類です。
performance.measure
メソッドの場合、「measure」になります。
- パフォーマンスエントリの種類です。
- startTime
- 「引数startMark.startTime」です(ミリ秒)。
- 引数startMarkが指定されなかった場合、ページのナビゲーション開始(すなわちページロード)からの経過時間(ミリ秒)になります。
- duration
- 「引数endMark.startTime - 引数startMark.startTime」です。引数endMarkが指定されなかった場合、引数startMark.startTimeから現在までの時間となります。
- detail
- この種類のパフォーマンスエントリでは常に
null
です。
- この種類のパフォーマンスエントリでは常に
PerformanceMeasureオブジェクトはperformance.getEntriesByName
メソッドやperformance.getEntriesByType
メソッドやperformance.getEntries
メソッドを用いて取得することができます。
performance.getEntriesByNameメソッドでPerformanceMeasureオブジェクトを取得する
performance.getEntriesByName('startToEndTime')
と記述すれば、startToEndTime
という名前の測定名のPerformanceMeasureオブジェクトを取得します。言い換えると、PerformanceMeasureオブジェクトのname
プロパティがstartToEndTime
であるものを全て取得します。
// 「start」と「end」と「subStart」と「subEnd」という名前のマークを作成
performance.mark('start');
performance.mark('end');
performance.mark('subStart');
performance.mark('subEnd');
// 「start」と「end」のマーク間の時間を測定する
performance.measure('startToEndTime', 'start', 'end');
// 「subStart」と「subEnd」のマーク間の時間を測定する
performance.measure('subStartTosubEndTime', 'subStart', 'subEnd');
// 「startToEndTime」という名前の測定名のPerformanceMeasureオブジェクトを取得(取得するのはオブジェクトの配列)
let entries = performance.getEntriesByName('startToEndTime');
// PerformanceMeasureオブジェクトを表示(オブジェクトの配列)
console.log(entries);
// ログ
// [
// PerformanceMeasure {
// name: 'startToEndTime',
// entryType: 'measure',
// startTime: 35.83770000934601,
// duration: 0.1362999677658081,
// detail: null
// }
// ]
// PerformanceMeasureオブジェクト配列の0番目の要素を表示(オブジェクト)
console.log(entries[0]);
// ログ
// PerformanceMeasure {
// name: 'startToEndTime',
// entryType: 'measure',
// startTime: 35.83770000934601,
// duration: 0.1362999677658081,
// detail: null
// }
performance.getEntriesByTypeメソッドでPerformanceMeasureオブジェクトを取得する
performance.getEntriesByType('measure')
と記述すれば、performance.measure
メソッドで作成したPerformanceMeasureオブジェクト
を全て取得します。
// 「start」と「end」と「subStart」と「subEnd」という名前のマークを作成
performance.mark('start');
performance.mark('end');
performance.mark('subStart');
performance.mark('subEnd');
// 「start」と「end」のマーク間の時間を測定する
performance.measure('startToEndTime', 'start', 'end');
// 「subStart」と「subEnd」のマーク間の時間を測定する
performance.measure('subStartTosubEndTime', 'subStart', 'subEnd');
// PerformanceMeasureオブジェクトを全て取得(取得するのはオブジェクトの配列)
let entries = performance.getEntriesByType('measure');
// PerformanceMeasureオブジェクトを全て表示(オブジェクトの配列)
console.log(entries);
// ログ
// [
// PerformanceMeasure {
// name: 'startToEndTime',
// entryType: 'measure',
// startTime: 37.3779000043869,
// duration: 0.14169996976852417,
// detail: null
// },
// PerformanceMeasure {
// name: 'subStartTosubEndTime',
// entryType: 'measure',
// startTime: 37.52869999408722,
// duration: 0.0034999847412109375,
// detail: null
// }
// ]
// PerformanceMeasureオブジェクト配列の0番目の要素を表示(オブジェクト)
console.log(entries[0]);
// ログ
// PerformanceMeasure {
// name: 'startToEndTime',
// entryType: 'measure',
// startTime: 37.3779000043869,
// duration: 0.14169996976852417,
// detail: null
// }
performance.getEntriesメソッドでPerformanceMeasureオブジェクトを取得する
performance.getEntries()
と記述すれば、performance.mark
メソッドで作成したPerformanceMarkオブジェクトとperformance.measure
メソッドで作成したPerformanceMeasureオブジェクトを全て取得します。
// 「start」と「end」と「subStart」と「subEnd」という名前のマークを作成
performance.mark('start');
performance.mark('end');
performance.mark('subStart');
performance.mark('subEnd');
// 「start」と「end」のマーク間の時間を測定する
performance.measure('startToEndTime', 'start', 'end');
// 「subStart」と「subEnd」のマーク間の時間を測定する
performance.measure('subStartTosubEndTime', 'subStart', 'subEnd');
// PerformanceMarkオブジェクトとPerformanceMeasureオブジェクトを全てを取得(取得するのはオブジェクトの配列)
let entries = performance.getEntries();
// PerformanceMarkオブジェクトとPerformanceMeasureオブジェクトを全て表示(オブジェクトの配列)
console.log(entries);
// ログ
// [
// PerformanceMark {
// name: 'start',
// entryType: 'mark',
// startTime: 36.91990000009537,
// duration: 0,
// detail: null
// },
// PerformanceMeasure {
// name: 'startToEndTime',
// entryType: 'measure',
// startTime: 36.91990000009537,
// duration: 0.1395999789237976,
// detail: null
// },
// PerformanceMark {
// name: 'end',
// entryType: 'mark',
// startTime: 37.059499979019165,
// duration: 0,
// detail: null
// },
// PerformanceMark {
// name: 'subStart',
// entryType: 'mark',
// startTime: 37.06839996576309,
// duration: 0,
// detail: null
// },
// PerformanceMeasure {
// name: 'subStartTosubEndTime',
// entryType: 'measure',
// startTime: 37.06839996576309,
// duration: 0.003300011157989502,
// detail: null
// },
// PerformanceMark {
// name: 'subEnd',
// entryType: 'mark',
// startTime: 37.07169997692108,
// duration: 0,
// detail: null
// }
// ]
// PerformanceMarkオブジェクトとPerformanceMeasureオブジェクトの配列の0番目の要素を表示(オブジェクト)
console.log(entries[0]);
// ログ
// PerformanceMark {
// name: 'start',
// entryType: 'mark',
// startTime: 36.91990000009537,
// duration: 0,
// detail: null
// }
本記事のまとめ
この記事では『JavaScriptのパフォーマンスを計測する方法』について、以下の内容を説明しました。
- performance.markとperformance.measureを用いてパフォーマンスを計測する方法
- performance.markとは
- performance.measureとは
お読み頂きありがとうございました。