性能計測機能を作ってみた

性能計測目的でログを埋め込む際のメモを書くつもりであったが、気付いたらそこそこの分量のコードを書いていた。。
※例外処理なし
※非クロージャ
※未単体テスト

使用例

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