性能計測機能を作ってみた
性能計測目的でログを埋め込む際のメモを書くつもりであったが、気付いたらそこそこの分量のコードを書いていた。。
※例外処理なし
※非クロージャ
※未単体テスト
使用例
speedTester.setStart('処理1'); // 処理1のコード speedTester.setEnd('処理1'); speedTester.setStart('処理2'); // 処理2のコード speedTester.setEnd('処理2'); speedTester.outputAllResults();
作成した機能
/** * 性能計測機能を提供します。 */ var speedTester = { start: {}, end: {}, /** * 性能計測を開始します。 * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能 */ setStart: function(id) { this.start[id] = new Date().getTime(); }, /** * 性能計測を終了します。 * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能 */ setEnd: function(id) { this.end[id] = new Date().getTime(); }, /** * 性能計測結果を出力します。 * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能 * @param outputFunc(result) 計測結果出力用関数。引数は、{id:計測id文字列, milliTime: 計測結果数値(ミリ秒)}。 * 省略した場合は、デフォルト出力先にデフォルトメッセージを出力 */ outputResult: function(id, outputFunc) { var milliTime = this.end[id] - this.start[id]; var result = {id: id, milliTime: milliTime}; if(outputFunc) { outputFunc(result); } else { var str = this._getDefaultOutputString(result); this._outputToDefault(str); } }, /** * すべての性能計測結果を出力します。 * @param outputAllResultsFunc(result) 計測結果出力用関数。引数は、{id:計測id文字列, milliTime: 計測結果数値(ミリ秒)}のリスト。 * 省略した場合は、デフォルト出力先にデフォルトメッセージを出力 */ outputAllResults: function(outputAllFunc) { var resultList = []; for(var id in this.end) { var milliTime = this.end[id] - this.start[id]; resultList.push({id: id, milliTime: milliTime}); } if(outputAllFunc) { outputAllFunc(resultList); } else { var str = this._getDefaultOutputStringForAll(resultList); this._outputToDefault(str); } }, /** * すべての計測結果を消去します。 */ clearAllResults: function() { this.start = {}; this.end = {}; }, /** * デフォルトメッセージを取得します。 * @param result 計測結果オブジェクト */ _getDefaultOutputString: function(result) { return '[debug]' + result.id +': ' + result.milliTime + '(ms)'; }, /** * 複数結果用のデフォルトメッセージを取得します。 * @param result 計測結果オブジェクトリスト */ _getDefaultOutputStringForAll: function(resultList) { var str = ''; for(var i = 0, len = resultList.length; i < len; i++) { var result = resultList[i]; str += this._getDefaultOutputString(result); if(i + 1 < len) { str += '\n'; } } return str; }, /** * デフォルト出力先にメッセージを出力します。 * @param str メッセージ */ _outputToDefault: function(str) { if(console.log) { console.log(str); } else { alert(str); } } };