多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

中國最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2

json教程

  • 關于 JSON
  • JSON 教程

    json格式

    JSON解析

    JSON遍歷

    JSON調用

    JSON轉換

    JSON獲取

    JSON字符串

    JSON數組

    JavaScript 解析Json字符串的性能比較分析代碼

    閱讀 (2219)

    我們在使用AJAX來做服務器端和客戶端交互的時候,一般的做法是讓服務器端返回一段JSON字符串,然后在客戶端把它解析成JavaScript對象。

    解析時用到的方法一般是eval或者new function,而目前IE8和Firefox3.1又內置了原生的JSON對象(據說會有一定的性能提升)。那我們在實際使用的時候怎樣從這三種方法(因為性能問題,不考慮用javascript實現的解析)里面來選擇呢?面對眾多的瀏覽器,哪種方式的性能是最好的呢? 

    一、測試方法
    1、首先指定測試次數及JSON字符串

    代碼如下:
    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}'; 
    

    2、循環解析并記錄時間
    eval
    代碼如下:
    var beginTime = new Date(); 
    for ( i = 0; i < count; i++ ) { 
    o = eval( "(" + jsonString + ")" ); 
    } 
    Console.output( "eval:" + ( new Date() - beginTime ) ); 
    
    new Function
    代碼如下:
    var 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" ) { 
    var 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!" ); 
    } 
    

    二、測試對象 

    選擇目前主流的瀏覽器(不考慮Maxthon一類的外殼),包括IE6、7、8,Firefox2、3、3.1,Chrome,Opera及Safari3、4。 

    三、測試環境 

    T9300 CPU + 4G RAM + Windows2003,其中IE8使用的是Vista的環境,IE7在另外一臺工作機(2G CPU + 2G RAM + Windows2003),考慮到主要是測試瀏覽器客戶端的性能,結果的誤差應該能夠接受。 

    四、測試結果


     

    *數值越小越好 

    *在當前列中綠色背景的表示性能最好,紅色性能最差 
    1、Firefox2、3全部墊底,IE6的性能優于IE7(可能和機器不一致有關),Chrome和Safari4的性能遠遠超出其它瀏覽器。 

    2、不同的瀏覽器下eval和new Function的性能不一致,總的來說eval更好,但Firefox下new Function的性能是eval的一倍,為了更好的兼容各個瀏覽器,我們把對JSON的解析單獨封裝成一個對象來處理: 
    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 + ")" ) 
    } 
    }; 
    var beginTime = new Date(); 
    for ( i = 0; i < count; i++ ) { 
    o = JSON.parse( jsonString ); } 
    Console.output( "wrapper:" + ( new Date() - beginTime ) ); 
    

    加入Wrapper后的結果: 


    由于涉及到調用對象的開銷,封裝后JSON對象會比單獨調用更慢,但它能保證在各個瀏覽器下使用最適合的方法。 


    五、結論
    解析Json字符串時,不同的瀏覽器選擇不同的方法: 

    IE6、7使用eval 
    IE8使用原生的JSON對象 
    Firefox2、3使用new Function 
    Safari4使用eval 
    其它瀏覽器下eval和new Function的性能基本一致 

    Update: 

    2009.03.23:屏蔽所有Firefox的Add-Ons再進行測試 
    由于Known在Firefox下運行代碼得到了完全不一致的結果,懷疑是Firefox的插件導致,于是禁掉所有插件后(后來表明幾乎由Firebug導致),重新在Firefox2、3下測試了一下,結果如下:


    這表明Firefox本身的性能并不是象我們先前測試的那樣低,在去掉插件后性能還是很不錯。但是沒有Firebug一類的插件支持,Firefox對我們的吸引力也大大降低了。 

    2009.03.31:循環中每次使用新的json字符串 
    根據Oliver的描述,他猜測是由于Safari4和Chrome緩存了eval的結果從而導致它們的測試成績“虛”高,測試結果證明了他的推測:


    從這個結果中我們可以看到,Opera的性能最好,Ie8其次。
    主要修改的代碼:

    代碼如下:
    //eval 2: var beginTime = new Date(); 
    for ( i = 0; i < count; i++ ) { 
    o = eval("(" + '{"value":{"items": [{"x":' + i + ',"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}' + ")"); 
    } 
    Console.output( "eval:" + ( new Date() - beginTime ) ); 
    //new Function 
    beginTime = new Date(); 
    for ( i = 0; i < count; i++ ) { 
    o = new Function("return " + '{"value":{"items": [{"x":' + i + ',"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}')(); 
    } 
    Console.output( "new Function:" + ( new Date() - beginTime ) ); 
    //native 
    if ( typeof JSON !== "undefined" ) { 
    beginTime = new Date(); 
    for ( i = 0; i < count; i++ ) { 
    o = JSON.parse('{"value":{"items": [{"x":' + i + ',"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}'); 
    } 
    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('{"value":{"items": [{"x":' + i + ',"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}'); 
    } 
    Console.output( "wrapper:" + ( new Date() - beginTime ) ); 
    

    附:全部代碼

    代碼如下:
    <!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(/MSIE\s([^;]*)/); 
    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> 
    



    關閉
    程序員人生
    主站蜘蛛池模板: 美国一级毛片免费 | 自拍偷拍欧美视频 | 操你.com | 久久是精品| 亚洲一级高清在线中文字幕 | 欧美日本免费一区二区三区 | 亚洲精品高清国产麻豆专区 | 久久亚洲精品成人 | 精品伊人久久大香线蕉网站 | 视频在线观看免费视频 | 伊人久久综合成人亚洲 | 免费观看片 | 最近高清中文字幕大全免费1 | 2020亚洲男人天堂 | 国产精品亚洲精品不卡 | 欧美成人性色大片在线观看 | 国产精品亚洲欧美日韩区 | 欧美成人性视频播放 | 日韩精品一区二区三区高清 | 日本高清免费网站zzzzzzzz | 精品一区二区免费视频 | 欧美老人巨大xxxx做受视频 | 日本爽| 欧美日韩一区二区视频免费看 | 久久综合九色综合桃花 | 日韩欧美精品综合一区二区三区 | 国产精品毛片在线更新 | 亚洲地址一地址二地址三 | 中文字幕第233页 | 日本免费不卡视频一区二区三区 | 一区二区三区久久 | 亚洲春色在线观看 | 国产一级做a爱片久久毛片a | 免费国产阿v视频在线观看 免费国产成高清人在线视频 | 多人伦交性欧美精品欧 | 亚洲春色校园 | 国产午夜精品片一区二区三区 | 免费不卡视频 | 欧美精品亚洲精品 | 国产大片免费天天看 | 国产三级国产精品国产国在线观看 |