当前位置: 代码迷 >> JavaScript >> javascript日期处置函数,对批处理做了性能优化
  详细解决方案

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

热度:329   发布时间:2012-09-08 10:48:07.0
javascript日期处理函数,对批处理做了性能优化

????? 今天是元旦假期最后一天,明天又要上班了 ,哎!人生最大的痛苦没过于上班。

?

????? 其实网上写javascript日期格式化的博文很多,大体都看了看,都还不错。唯一遗憾的是只顾着实现了功能,没对函数进行性能优化。

?

????? 俗话说:不要重复造轮子。google上找了一个比较不错的日期格式化函数,来开始我的优化之旅吧!

?

????? google上找的这个日期函数化函数,估计大家都很眼熟,以前我也一直在用。先看看优化后和优化前的效率对比吧!

?

1、优化之前的toDate函数(字符串转换成Date对象),重复执行1万次,耗时660毫秒

?

?

2、优化之前的dateFormat函数(Date对象格式化成字符串),重复执行1万次,耗时676毫秒

?

?

3、优化过后的toDate函数,重复执行1万次,耗时122毫秒

?

?

4、优化后的dateFormat函数,重复执行1万次,耗时160毫秒

?

?

?

?????? 为什么前后差别这么大,其实我也没做多少处理,只是为批处理做了一些缓存而已,认真观察所有网上那些日期格式函数,其实都是用正则进行匹配和替换。其实正则是很耗性能的,于是我在正则匹配的地方做了缓存,把匹配值建立索引。以后就不用每次都去做正则匹配了。

?

????? 无代码无真相,接下来看看真相吧!

?

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

?

笔者非web前端开发者,才疏学浅、多多包涵。

感觉有用你就顶一下,多多交流...

?

此文原创,转载请注明原文出处http://jefflan.iteye.com/blog/1333578 ,多谢!

?

?

1 楼 1927105 2012-01-03  
请问lz,此用法的场景是什么、?
2 楼 JeffLan 2012-01-03  
1927105 写道
请问lz,此用法的场景是什么、?

这纯属个人洁癖,优不优化都差不多,前台处理上万条数据的可能性很小。

不过在集合操作中还是有一点性能提高,比如说有一个列表,每一列都需要对日期进行格式化显示,它们所要格式化的样式也是一样的,这种情况下效率是有些提高的。在性能提高上虽然很小,但积少成多。
3 楼 JeffLan 2012-01-03  
其实吧!一个高性能的应用程序,都是从每个小细节开始做起的。
  相关解决方案