WEB开发网
开发学院网页设计JavaScript JavaScript解析Json字符串的性能比较 阅读

JavaScript解析Json字符串的性能比较

 2010-09-14 13:43:29 来源:WEB开发网   
核心提示: 图片看不清楚?请点击这里查看原图(大图),由于涉及到调用对象的开销,JavaScript解析Json字符串的性能比较(4),封装后JSON对象会比单独调用更慢,但它能保证在各个浏览器下使用最适合的方法,在去掉插件后性能还是很不错,但是没有Firebug一类的插件支持,五、结论解析Json字

图片看不清楚?请点击这里查看原图(大图)。

由于涉及到调用对象的开销,封装后JSON对象会比单独调用更慢,但它能保证在各个浏览器下使用最适合的方法。

五、结论

解析Json字符串时,不同的浏览器选择不同的方法:

IE6、7使用eval

IE8使用原生的JSON对象

Firefox2、3使用new Function

Safari4使用eval

其它浏览器下eval和new Function的性能基本一致

如果有不同意见欢迎拍砖:)

Update:

2009.03.23

由于Known在Firefox下运行代码得到了完全不一致的结果,怀疑是Firefox的插件导致,于是禁掉所有插件后(后来表明几乎由Firebug导致),重新在Firefox2、3下测试了一下,结果如下:

JavaScript解析Json字符串的性能比较

图片看不清楚?请点击这里查看原图(大图)。 

这表明Firefox本身的性能并不是象我们先前测试的那样低,在去掉插件后性能还是很不错。但是没有Firebug一类的插件支持,Firefox对我们的吸引力也大大降低了。

附:全部代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Parse JsonString</title>
    </head>
    <body>
        <div id="consoleRegion"></div>
        <script type="text/javascript">
            //yui
            var Browser = function() {
                var o = {
                    ie: 0,
                    opera: 0,
                    gecko: 0,
                    webkit: 0
                };
                var ua = navigator.userAgent, m;
                if ( ( /KHTML/ ).test( ua ) ) {
                    o.webkit = 1;
                }
                // Modern WebKit browsers are at least X-Grade
                m = ua.match(/AppleWebKit/([^s]*)/);
                if (m&&m[1]) {
                    o.webkit=parseFloat(m[1]);
                }

                if (!o.webkit) { // not webkit
                    // @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
                    m=ua.match(/Opera[s/]([^s]*)/);
                    if (m&&m[1]) {
                        o.opera=parseFloat(m[1]);
                    } else { // not opera or webkit
                        m=ua.match(/MSIEs([^;]*)/);
                        if (m&&m[1]) {
                            o.ie=parseFloat(m[1]);
                        } else { // not opera, webkit, or ie
                            m=ua.match(/Gecko/([^s]*)/);
                            if (m) {
                                o.gecko=1; // Gecko detected, look for revision
                                m=ua.match(/rv:([^s)]*)/);
                                if (m&&m[1]) {
                                    o.gecko=parseFloat(m[1]);
                                }
                            }
                        }
                    }
                }
                return o;
            }();

            var Console = {
                consoleRegion: null,

                getRegion: function() {
                    if ( this.consoleRegion === null ) {
                        this.consoleRegion = document.getElementById( "consoleRegion" );
                    }
                    return this.consoleRegion;
                },

                output: function( text ) {

                    this.getRegion().innerHTML += "<br/>" + text;

                }
            };
            //test code
            var count = 10000, o = null, i = 0, jsonString = '{"value":{"items": [{"x":1,"y":2,"z":3}, {"x":1,"y":2,"z":3}, {"x":1,"y":2,"z":3}, {"x":1,"y":2,"z":3}, {"x":1,"y":2,"z":3}]},"error":null}';
            //eval
            var beginTime = new Date();
            for ( i = 0; i < count; i++ ) {
                o = eval( "(" + jsonString + ")" );
            }
            Console.output( "eval:" + ( new Date() - beginTime ) );
            //new Function
            beginTime = new Date();
            for ( i = 0; i < count; i++ ) {
                o = new Function( "return " + jsonString )();
            }
            Console.output( "new Function:" + ( new Date() - beginTime ) );
            //native
            if ( typeof JSON !== "undefined" ) {
                beginTime = new Date();
                for ( i = 0; i < count; i++ ) {
                    o = JSON.parse( jsonString );

                }
                Console.output( "native:" + ( new Date() - beginTime ) );
            } else {
                Console.output( "native:not support!" );
            }
            //wrapper
            var __json = null;
            if ( typeof JSON !== "undefined" ) {
                __json = JSON;
            }
            var browser = Browser;
            var JSON = {
                parse: function( text ) {
                    if ( __json !== null ) {
                        return __json.parse( text );
                    }
                    if ( browser.gecko ) {
                        return new Function( "return " + text )();
                    }
                    return eval( "(" + text + ")" )
                }
            };          
            beginTime = new Date();
            for ( i = 0; i < count; i++ ) {
                o = JSON.parse( jsonString );

            }
            Console.output( "wrapper:" + ( new Date() - beginTime ) );
            //alert( o.value.items[0].z );
        </script>
    </body>
</html>

上一页  1 2 3 4 

Tags:JavaScript 解析 Json

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接