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

前回作ったものを、コンストラクタ形式に書き換えた。
これにより、内部で使用する変数を隠蔽することができる。

var st = new SpeedTester();

st.setStart('処理1');
// 処理1のコード
st.setEnd('処理1');

st.setStart('処理2');
// 処理2のコード
st.setEnd('処理2');

st.outputAllResults();
/**
 * 性能計測機能を提供します。
 */
function SpeedTester() {
    var start = {};
    var end = {};

    /**
     * 性能計測を開始します。
     * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能
     */
    this.setStart = function(id) {
        start[id] = new Date().getTime();
    };

    /**
     * 性能計測を終了します。
     * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能
     */
    this.setEnd = function(id) {
        end[id] = new Date().getTime();
    };

    /**
     * 性能計測結果を出力します。
     * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能
     * @param outputFunc(result) 計測結果出力用関数。引数は、{id:計測id文字列, milliTime: 計測結果数値(ミリ秒)}。
     *                           省略した場合は、デフォルト出力先にデフォルトメッセージを出力
     */
    this.outputResult = function(id, outputFunc) {
        var milliTime = end[id] - start[id];
        var result = {id: id, milliTime: milliTime};
        if(outputFunc) {
            outputFunc(result);
        }
        else {
            var str = _getDefaultOutputString(result);
            _outputToDefault(str);
        }
    };

    /**
     * すべての性能計測結果を出力します。
     * @param outputAllResultsFunc(result) 計測結果出力用関数。引数は、{id:計測id文字列, milliTime: 計測結果数値(ミリ秒)}のリスト。
     *                                     省略した場合は、デフォルト出力先にデフォルトメッセージを出力
     */
    this.outputAllResults = function(outputAllFunc) {
        var resultList = [];
        for(var id in end) {
            var milliTime = end[id] - start[id];
            resultList.push({id: id, milliTime: milliTime});
        }
        if(outputAllFunc) {
            outputAllFunc(resultList);
        }
        else {
            var str = _getDefaultOutputStringForAll(resultList);
            _outputToDefault(str);
        }
    };

    /**
     * すべての計測結果を消去します。
     */
    this.clearAllResults = function() {
        start = {};
        end = {};
    };

    /**
     * デフォルトメッセージを取得します。
     * @param result 計測結果オブジェクト
     */
    function _getDefaultOutputString(result) {
        return '[debug]' + result.id +': ' + result.milliTime + '(ms)';
    }

    /**
     * 複数結果用のデフォルトメッセージを取得します。
     * @param result 計測結果オブジェクトリスト
     */
    function _getDefaultOutputStringForAll(resultList) {
        var str = '';
        for(var i = 0, len = resultList.length; i < len; i++) {
            var result = resultList[i];
            str += _getDefaultOutputString(result);
            if(i + 1 < len) {
                str += '\n';
            }
        }
        return str;
    }

    /**
     * デフォルト出力先にメッセージを出力します。
     * @param str メッセージ
     */
    function _outputToDefault(str) {
        if(console.log) {
            console.log(str);
        }
        else {
            alert(str);
        }
    }
}