javascript日期处理函数,对批处理做了性能优化

openkk 12年前
     <p>      俗话说:不要重复造轮子。google上找了一个比较不错的日期格式化函数,来开始我的优化之旅吧!</p>    <p> </p>    <p>      google上找的这个日期函数化函数,估计大家都很眼熟,以前我也一直在用。先看看优化后和优化前的效率对比吧!</p>    <p> </p>    <p>1、优化之前的toDate函数(字符串转换成Date对象),重复执行1万次,耗时660毫秒</p>    <p><img title="javascript日期处理函数,对批处理做了性能优化" border="0" alt="javascript日期处理函数,对批处理做了性能优化" src="https://simg.open-open.com/show/9f56d153277301807add6ec679ff5400.png" width="502" height="155" /></p>    <p> </p>    <p> </p>    <p>2、优化之前的dateFormat函数(Date对象格式化成字符串),重复执行1万次,耗时676毫秒</p>    <p><img title="javascript日期处理函数,对批处理做了性能优化" border="0" alt="javascript日期处理函数,对批处理做了性能优化" src="https://simg.open-open.com/show/9928b3a9157047e949be8c3656d151a5.png" width="465" height="160" /></p>    <p> </p>    <p> </p>    <p>3、优化过后的toDate函数,重复执行1万次,耗时122毫秒</p>    <p><img title="javascript日期处理函数,对批处理做了性能优化" border="0" alt="javascript日期处理函数,对批处理做了性能优化" src="https://simg.open-open.com/show/9918ffaaef8b8c6517156501176076d1.png" width="508" height="148" /></p>    <p> </p>    <p> </p>    <p>4、优化后的dateFormat函数,重复执行1万次,耗时160毫秒</p>    <p><img title="javascript日期处理函数,对批处理做了性能优化" border="0" alt="javascript日期处理函数,对批处理做了性能优化" src="https://simg.open-open.com/show/04a8f1a09d9116258ee264ab17a2e06b.png" width="475" height="157" /></p>    <p> </p>    <p> </p>    <p> </p>    <p>       为什么前后差别这么大,其实我也没做多少处理,只是为批处理做了一些缓存而已,认真观察所有网上那些日期格式函数,其实都是用正则进行匹配和替换。其实正则是很耗性能的,于是我在正则匹配的地方做了缓存,把匹配值建立索引。以后就不用每次都去做正则匹配了。</p>    <p> </p>    <p>      无代码无真相,接下来看看真相吧!</p>    <pre class="brush:javascript; toolbar: true; auto-links: false;">(function(window) {     var sinojh = {         Version : "1.2",         Copyright : "Copyright© sino-jh 2012",         Author : "Jeff Lan",         Email : "jefflan@live.cn"     };     /**      * 方便于添加和重写类的属性      * @param {Object} attributes 添加的属性      */     Function.prototype.prototypes = function(attributes) {         for ( var a in attributes) {             this.prototype[a] = attributes[a];         }     };     /**      * 获取Url参数      * @param {String} parameter 参数名      * @return {String} 参数值      */     sinojh.getUrlParameter = function(parameter) {         if (!sinojh.getUrlParameter.cache) {             var url = window.location.href;             var paraString = url.substring(url.indexOf("?") + 1, url.length).split("&");             var cache = {};             for ( var i in paraString) {                 var j = paraString[i];                 cache[j.substring(0, j.indexOf("="))] = j.substring(j.indexOf("=") + 1, j.length);             }             sinojh.getUrlParameter.cache = cache;         }         return sinojh.getUrlParameter.cache[parameter];     };     /**      * 日期格式化      * @param {Date} date 日期对象      * @param {String} formatStyle 格式化样式      * @return {String} 日期型字符串      */     sinojh.dateFormat = function(date, formatStyle) {         formatStyle = formatStyle ? formatStyle : sinojh.dateFormat.settings.formatStyle;         var time = {             "M+" : date.getMonth() + 1,             "d+" : date.getDate(),             "h+" : date.getHours(),             "m+" : date.getMinutes(),             "s+" : date.getSeconds(),             "S" : date.getMilliseconds()         };         if (formatStyle == sinojh.dateFormat.formatStyleCache) {             var replaceCache = sinojh.dateFormat.replaceCache;             if (replaceCache["y+"]) {                 formatStyle = formatStyle.replace(replaceCache["y+"].replace, (date.getFullYear() + "").substring(replaceCache["y+"].index));             }             for ( var k in time) {                 if (replaceCache[k]) {                     formatStyle = formatStyle.replace(replaceCache[k].replace, replaceCache[k].replace.length == 1 ? time[k] : ("00" + time[k]).substring(("" + time[k]).length));                 }             }         } else {             sinojh.dateFormat.formatStyleCache = formatStyle;             var replaceCache = {};             if (new RegExp("(y+)").test(formatStyle)) {                 var index = 4 - RegExp.$1.length;                 replaceCache["y+"] = {                     replace : RegExp.$1,                     index : index                 };                 formatStyle = formatStyle.replace(RegExp.$1, (date.getFullYear() + "").substring(index));             }             for ( var k in time) {                 if (new RegExp("(" + k + ")").test(formatStyle)) {                     replaceCache[k] = {                         replace : RegExp.$1                     };                     formatStyle = formatStyle.replace(RegExp.$1, RegExp.$1.length == 1 ? time[k] : ("00" + time[k]).substring(("" + time[k]).length));                 }             }             sinojh.dateFormat.replaceCache = replaceCache;         }         return formatStyle;     };     sinojh.dateFormat.settings = {         formatStyle : "yyyy-MM-dd hh:mm:ss"     };     /**      * 将日期格式的字符串转换成Date对象      * @param {String} dateStr 日期格式字符串      * @param {String} dateStyle 日期格式      * @return {Date} 日期对象      */     sinojh.toDate = function(dateStr, dateStyle) {         dateStyle = dateStyle ? dateStyle : sinojh.toDate.settings.dateStyle;         var compare = sinojh.toDate.compare;         var result = new sinojh.toDate.result();         if (dateStyle == sinojh.toDate.settings.dateStyleCache) {             var indexCache = sinojh.toDate.indexCache;             for ( var k in compare) {                 if (indexCache[k]) {                     result[compare[k]] = dateStr.substring(indexCache[k].index, indexCache[k].index + indexCache[k].length);                 }             }         } else {             var indexCache = {};             for ( var k in compare) {                 if (new RegExp("(" + k + ")").test(dateStyle)) {                     var index = dateStyle.indexOf(RegExp.$1);                     var length = RegExp.$1.length;                     indexCache[k] = {                         index : index,                         length : length                     };                     result[compare[k]] = dateStr.substring(index, index + length);                 }             }             sinojh.toDate.indexCache = indexCache;             sinojh.toDate.settings.dateStyleCache = dateStyle;         }         return new Date(result["y"], result["M"] - 1, result["d"], result["h"], result["m"], result["s"], result["S"]);     };     sinojh.toDate.compare = {         "y+" : "y",         "M+" : "M",         "d+" : "d",         "h+" : "h",         "m+" : "m",         "s+" : "s",         "S" : "S"     };     sinojh.toDate.result = function() {     };     sinojh.toDate.result.prototypes( {         "y" : "",         "M" : "",         "d" : "",         "h" : "00",         "m" : "00",         "s" : "00",         "S" : "000"     });     sinojh.toDate.settings = {         dateStyle : "yyyy-MM-dd hh:mm:ss"     };     delete Function.prototype.prototypes;     window.jh = sinojh; }(this); </pre>此文原创,转载请注明原文出处    <a title="Jeff Lan" href="/misc/goto?guid=4959500251629429046">http://jefflan.iteye.com/blog/1333578</a> ,多谢!    <p></p>