如何加快这一点JSON日期解析?

时间:2011-03-23 17:40:37

标签: javascript ajax json

我在大约5年前在这个项目中使用了一个AJAX库,并且它在使用JSON解析日期时遇到了一些问题。我最后重写其解析函数以使用单个正则表达式:

return eval('(' + (enableDateParsing ? text.replace(/"(?:\\)?\/Date\((.*?)\)(?:\\)?\/"/g, "new Date($1)") : text) + ')');

这非常有效,但我认为如果我在IE8 / chrome / ff中使用原生JSON解析,我可以加快速度,所以我添加了这一点:

if (typeof JSON !== 'undefined' && typeof JSON.parse !== 'undefined') {     
        var nativeJsonDateParseRegex = /\/Date\(.*?\)\//g;       
        return JSON.parse(text, function (key, value) {
            if (AjaxPro.enableDateParsing && typeof value === 'string' && value.match(nativeJsonDateParseRegex)) 
            {
                value = new Date(parseInt(value.substr(6)));
            }                       
            return value;         
        });        
    } 
else // revert to eval for ie6/ie7

对于返回的每个JSON属性,reviver回调将执行一次,因此它必须非常快。在一个配置文件中,我看到它被称为170484次,但仍然运行得非常快(131.237ms)。关于如何加快速度的任何想法,或者这是没有认真调整的最佳方法吗?

2 个答案:

答案 0 :(得分:1)

一个不太好的微优化,但仍然值得一试。 由于您的子字符串仅包含毫秒时间戳,因此没有其他垃圾字符串。 您可以删除对parseInt的调用。 您可以尝试使用简单的数学运算进行类型转换,例如乘以1 。 如果你过于热衷于微观优化,可能会节省一些时间。

 value = new Date(1*(value.substr(6)));

示例:

a = "a:3333";
b = a.substring(2);
alert(b*2); // alerts 6666

答案 1 :(得分:1)

您的代码包含许多常量条件,您可以检查是否支持原生JSON。

建议:

  • 在页面加载时检查本机JSPN支持,并相应地添加正确的函数。
  • 如果您不需要,请从正则表达式中删除全局标志
  • 如果可能,删除正则表达式,如果每个日期始终以“/日期”开头,则搜索它。它要快得多(见benchmark at jsperf.com
  • todo:检查是否可以用其他方法替换parseInt以消除尾随)/
  • 如果AjaxPro.enableDateParsing是一个常量,您可以从AjaxPro.jsonParse删除,并使其成为检查本机JSON的条件

没有RE的代码:

if (typeof JSON !== 'undefined' && typeof JSON.parse !== 'undefined') {
    AjaxPro.nativeJsonDateParseRegex = /\/Date\(.*?\)\//g;
    AjaxPro.dateFunc = function(key, value) {
       if (typeof value === "string" && !value.indexOf("/Date(")) {
           return new Date(value.substring(6, value.length-2));
       }
       return value;
    };
    AjaxPro.jsonParse = function(text) {
        if (AjaxPro.enableDateParsing) {
            return JSON.parse(text, AjaxPro.dateFunc);
        }
        return JSON.parse(text);
    };
} else // revert to eval for ie6/ie7

这应该高度优化。您可能希望在多个浏览器中自行运行更多测试。也许检查一个字符串的属性比检查它的类型(怀疑它)更快,就像那样。