性能計測機能を作ってみた5〜okknパッケージを作ってみた1〜

ロガーも追加して、パッケージ okkn.util としてひとまとめにしてみた。

okkn.js

if(okkn !== undefined) {
    var _okkn = okkn;
}
var okkn = {};

okkn.util = (function() {

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

    return {
        /**
         * ログ機能を提供します。
         */
        createLogger: function(str, outputFunc) {
            var _outputFunc = outputFunc;
            return {
                log: function(str) {
                    if(_outputFunc) {
                        _outputFunc(str);
                    }
                    else {
                        outputToDefault(str);
                    }
                },
                setOutputFunc: function(outputFunc) {
                    _outputFunc = outputFunc;
                }
            };
        },

        /**
         * 性能計測機能を提供します。
         */
        createSpeedTester: function() {
            var start = {};
            var 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;
            }

            return {

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

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

                /**
                 * 性能計測結果を出力します。
                 * @param id 計測を一意に識別するための文字列。同時に複数の計測を行わない場合は省略可能
                 * @param outputFunc(result) 計測結果出力用関数。引数は、{id:計測id文字列, milliTime: 計測結果数値(ミリ秒)}。
                 *                           省略した場合は、デフォルト出力先にデフォルトメッセージを出力
                 */
                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: 計測結果数値(ミリ秒)}のリスト。
                 *                                     省略した場合は、デフォルト出力先にデフォルトメッセージを出力
                 */
                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);
                    }
                },

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

使用例

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
  <HEAD>
    <TITLE>okkn.util動作確認</TITLE>
      <SCRIPT src="http://code.jquery.com/jquery-1.6.2.js"></SCRIPT>
      <SCRIPT src="./jquery.appendchildren.js"></SCRIPT>
      <SCRIPT src="./okkn.js"></SCRIPT>
      <SCRIPT type="text/javascript">
        //<![CDATA[
          $(function(){
              var st = okkn.util.createSpeedTester();
              var logger = okkn.util.createLogger();
              
              logger.log('開始');

              st.setStart('appendChildren デフォルト');
              $('body').appendChildren();
              st.setEnd('appendChildren デフォルト');

              st.setStart('appendChildren table, w5, d5');
              $('body').appendChildren({nodeName:'table', width:5, depth:5});
              st.setEnd('appendChildren table, w5, d5');
              
              logger.log('終了');
              st.outputAllResults();
          });
        //]]>
      </SCRIPT>
  </HEAD>
  <BODY>
  </BODY>
</HTML>