性能計測機能を作ってみた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>