日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

中國最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2

json教程

  • 關(guān)于 JSON
  • JSON 教程

    json格式

    JSON解析

    JSON遍歷

    JSON調(diào)用

    JSON轉(zhuǎn)換

    JSON獲取

    JSON字符串

    JSON數(shù)組

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

    閱讀 (2224)

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

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

    一、測試方法
    1、首先指定測試次數(shù)及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、循環(huán)解析并記錄時(shí)間
    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,F(xiàn)irefox2、3、3.1,Chrome,Opera及Safari3、4。 

    三、測試環(huán)境 

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

    四、測試結(jié)果


     

    *數(shù)值越小越好 

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

    2、不同的瀏覽器下eval和new Function的性能不一致,總的來說eval更好,但Firefox下new Function的性能是eval的一倍,為了更好的兼容各個(gè)瀏覽器,我們把對JSON的解析單獨(dú)封裝成一個(gè)對象來處理: 
    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后的結(jié)果: 


    由于涉及到調(diào)用對象的開銷,封裝后JSON對象會(huì)比單獨(dú)調(diào)用更慢,但它能保證在各個(gè)瀏覽器下使用最適合的方法。 


    五、結(jié)論
    解析Json字符串時(shí),不同的瀏覽器選擇不同的方法: 

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

    Update: 

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


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

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


    從這個(gè)結(jié)果中我們可以看到,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> 
    



    關(guān)閉
    程序員人生
    主站蜘蛛池模板: 一区在线免费观看 | 国产精品一区一区三区 | 免费在线观看黄色 | 亚洲精品视频自拍 | 国产成人在线视频网站 | 国产成人在线不卡 | 欧亚日韩精品一区二区在线 | 国产一区二区精品久久 | 老头搡老女人毛片视频在线看 | 亚洲高清自拍 | 亚洲 变态 欧美 另类 捆绑 | 在线精品一区二区 | 久久久久久综合 | 国产成人精品一区二区在线观看 | 国产在线观看一区二区三区 | 韩日一级片 | 男女污视频在线观看 | 波多野结衣中文字幕久久 | 久久久久黄色 | 国产精品久久久久久久久久新婚 | 国产视频久久久 | 久久精品9 | 日韩在线播放一区 | 黄色片网站免费 | 日韩一区二区三区四区五区六区 | 六月久久 | 精品自拍视频 | 99国产精品国产精品久久 | 国产精品一区在线播放 | 日韩激情在线 | 成年人av网站 | 99精品视频免费在线观看 | 1区2区3区国产 | 久久精品一区二区三区不卡牛牛 | 欧美日韩在线视频免费观看 | av片在线免费观看 | 在线黄av | 亚洲视频一二 | 精品国产1区2区3区 一区二区自拍 | 国产精品一区二区三区久久久 | 最新中文字幕在线视频 |