<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-193  評(píng)論-715  文章-1  trackbacks-0

    同事寫(xiě)了段JQuey的代碼,在某些機(jī)器上,會(huì)出現(xiàn)IE假死的性能問(wèn)題。

    我測(cè)試了一下代碼花費(fèi)的時(shí)間,在我的機(jī)器上,會(huì)花費(fèi)600多毫秒,但在某些機(jī)器上會(huì)花費(fèi)6秒多(10倍的增長(zhǎng)),這樣就導(dǎo)致了IE的假死。而且發(fā)現(xiàn)與IE版本無(wú)關(guān),在大多數(shù)機(jī)器上會(huì)都只需要600多毫秒,不過(guò)CPU會(huì)有10%以上的瞬間提長(zhǎng)。

    先來(lái)看看出問(wèn)題的代碼:

    $(".eXtremeTable").replaceWith($(html).find(".eXtremeTable"));
    $(
    "#levelGroup").replaceWith($(html).find("#levelGroup"));
    $(
    "#scriptDiv").replaceWith($(html).find("#scriptDiv"));
    其實(shí)這段代碼很簡(jiǎn)潔,只是將用AJAX取過(guò)來(lái)的數(shù)據(jù)替換一部分當(dāng)前頁(yè)面的數(shù)據(jù),但性能確實(shí)不夠好。

    開(kāi)始找原因,看看到底是什么慢?
    $(".eXtremeTable").replaceWith($(html).find(".eXtremeTable"));
    將此行代碼分拆,逐元素去分析各自花費(fèi)的時(shí)間:
    $(".eXtremeTable")  花費(fèi)20毫秒左右;
    $(html).find(".eXtremeTable")  花費(fèi)200毫秒左右;
    replaceWith()  花費(fèi)10毫秒左右;
    不難定位到是由于$(html).find(".eXtremeTable")這種方式引起的。
    (這都是在我機(jī)器上的測(cè)試結(jié)果,而且每次可能不完全一樣)

    簡(jiǎn)單的可以這樣優(yōu)化:
    var newPage=$(html);
    $(
    ".eXtremeTable").replaceWith(newPage.find(".eXtremeTable"));
    $(
    "#levelGroup").replaceWith(newPage.find("#levelGroup"));
    $(
    "#scriptDiv").replaceWith(newPage.find("#scriptDiv"));
    但仔細(xì)想想,這樣仍然會(huì)造成在某些機(jī)器上2秒以上的時(shí)間消耗,照樣是不可接受的。

    遂采用比較原始的辦法,修改源程序如下:
         var tab='<span id=\"data\">';
                
    var pos=html.indexOf(tab)
                
    var content=html.substr(pos+tab.length);
                
    var pos2=content.indexOf('</span>');
                
    var content=content.substr(0,pos2);
                document.getElementById(
    "data").innerHTML=content;
               
    // $(".eXtremeTable").replaceWith($(html).find(".eXtremeTable"));
              
                var counter='<td id=\"counter\" align=\"right\" width=\"300\">';
                pos
    =html.indexOf(counter)
                content
    =html.substr(pos+counter.length);
                pos2
    =content.indexOf('</table>');
                
    var content=content.substr(0,pos2+'</table>'.length);
                document.getElementById(
    "counter").innerHTML=content;
               
    // $("#levelGroup").replaceWith($(html).find("#levelGroup"));

                var sel='<div id=\"scriptDiv\" style=\"display:none;\">'
                pos
    =html.indexOf(sel)
                content
    =html.substr(pos+sel.length);
                pos2
    =content.indexOf('</div>');
                
    var content=content.substr(0,pos2+'</div>'.length);
                document.getElementById(
    "scriptDiv").innerHTML=content;            
               
    // $("#scriptDiv").replaceWith($(html).find("#scriptDiv"));
    現(xiàn)在此段代碼花費(fèi)的時(shí)間幾乎為0毫秒。

    OK,IE再也不假死了。

    問(wèn)題分析:
    原因應(yīng)該就出在jQuery(html)這個(gè)方法上,官方文檔解釋如下:
    根據(jù)提供的原始 HTML 標(biāo)記字符串,動(dòng)態(tài)創(chuàng)建由 jQuery 對(duì)象包裝的 DOM 元素。 
    你可以傳遞一個(gè)手寫(xiě)的 HTML 字符串,或者由某些模板引擎或插件創(chuàng)建的字符串,也可以是通過(guò) AJAX 加載過(guò)來(lái)的字符串。但是在你創(chuàng)建 input 元素的時(shí)會(huì)有限制,可以參考第二個(gè)示例。當(dāng)然這個(gè)字符串可以包含斜杠 (比如一個(gè)圖像地址),還有反斜杠。當(dāng)你創(chuàng)建單個(gè)元素時(shí),請(qǐng)使用閉合標(biāo)簽或 XHTML 格式。例如,創(chuàng)建一個(gè) span ,可以用 $(
    "<span/>") 或 $("<span></span>") ,但不推薦 $("<span>"
    --------------------------------------------------------------------------------
    Create DOM elements on
    -the-fly from the provided String of raw HTML. 
    You can pass 
    in plain HTML Strings written by hand, create them using some template engine or plugin, or load them via AJAX. There are limitations when creating input elements, see the second example. Also when passing strings that may include slashes (such as an image path), escape the slashes. When creating single elements use the closing tag or XHTML format. For example, to create a span use $("<span/>") or $("<span></span>") instead of without the closing slash/tag. 
    因?yàn)橐獦?gòu)建一個(gè)完整的DOM,所以需要花費(fèi)較長(zhǎng)的時(shí)間。

    至于為何在某些機(jī)器上出現(xiàn)高達(dá)6秒多的時(shí)間消耗,百思不得其解,請(qǐng)高手指點(diǎn)!

    特別提示:
    本Blog所有內(nèi)容不得隨意轉(zhuǎn)載,版權(quán)屬于作者所有。如需轉(zhuǎn)載請(qǐng)與作者聯(lián)系(
    fastzch@163.com)。未經(jīng)許可的轉(zhuǎn)載,本人保留一切法律權(quán)益。
    posted on 2009-06-14 14:39 Robin's Programming World 閱讀(2656) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): 其它

    評(píng)論:
    # re: 一次JQuery性能優(yōu)化實(shí)戰(zhàn) 2009-06-15 09:16 | HiMagic!
    那你修改后,在別的機(jī)器上也是6秒?如果時(shí)間還很長(zhǎng),看一下ajax的反應(yīng)速度。  回復(fù)  更多評(píng)論
      
    # re: 一次JQuery性能優(yōu)化實(shí)戰(zhàn) 2009-06-15 09:50 | usherlight
    會(huì)不會(huì)和jquery的版本有關(guān)?據(jù)說(shuō)1.3之后的版本改進(jìn)了dom  回復(fù)  更多評(píng)論
      
    # re: 一次JQuery性能優(yōu)化實(shí)戰(zhàn) 2009-06-15 10:07 | Robin's Java World
    @HiMagic!
    修改后所有的機(jī)器都可以達(dá)到幾乎0秒!
    因?yàn)椴恍枰獦?gòu)建DOM了。  回復(fù)  更多評(píng)論
      
    # re: 一次JQuery性能優(yōu)化實(shí)戰(zhàn) 2009-06-15 11:02 | kane
    不需要構(gòu)造dom卻使用了構(gòu)造dom的方法,而沒(méi)有預(yù)料到構(gòu)造dom是很耗時(shí)的操作。所以說(shuō)我們使用工具,只有深入了解其特性才能正確地使用  回復(fù)  更多評(píng)論
      
    # re: 一次JQuery性能優(yōu)化實(shí)戰(zhàn) 2009-06-15 14:43 | Robin's Java World
    @kane
    說(shuō)得很有道理。  回復(fù)  更多評(píng)論
      
    # re: 一次JQuery性能優(yōu)化實(shí)戰(zhàn) 2009-06-15 15:47 | metadmin
    真?zhèn)€頁(yè)面是DOM嗎?如果是,這無(wú)法接受。我更傾向于gwt那樣,在某個(gè)div里面嵌入ajax。


    ---------------------------------
    解開(kāi)權(quán)限與業(yè)務(wù)耦合,提高開(kāi)發(fā)效率
    細(xì)粒度權(quán)限管理軟件 試用版下載
    http://www.metadmin.com

      回復(fù)  更多評(píng)論
      
    # re: 一次JQuery性能優(yōu)化實(shí)戰(zhàn) 2016-01-04 17:42 | bns
    不需要構(gòu)建DOM  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 久久不见久久见中文字幕免费| 污污的视频在线免费观看| 国产羞羞的视频在线观看免费 | 亚洲免费视频网址| 亚洲AV无码成人精品区在线观看 | 日韩免费无码一区二区视频| 久久精品国产亚洲AV忘忧草18| 日本人的色道免费网站| 亚洲免费黄色网址| 国产在线观看片a免费观看| 亚洲五月丁香综合视频| 免费看国产精品3a黄的视频| 亚洲综合一区无码精品| 免费看美女让人桶尿口| 免费无码国产V片在线观看| 久久亚洲2019中文字幕| 久久99毛片免费观看不卡| 久久久亚洲欧洲日产国码aⅴ| 色影音免费色资源| 亚洲中文无码永久免| 免费精品国产自产拍观看| 一区二区三区在线免费观看视频 | 亚洲日韩精品A∨片无码加勒比| 免费看的成人yellow视频| 一级毛片免费播放男男| 亚洲AV永久无码精品水牛影视| 91精品成人免费国产片| 亚洲日本乱码卡2卡3卡新区| 四虎永久在线精品视频免费观看| 国产高潮流白浆喷水免费A片 | 久久久影院亚洲精品| 嫩草影院在线免费观看| 一区二区三区免费视频观看| 久久精品夜色国产亚洲av| 毛片免费全部免费观看| h视频在线观看免费| 亚洲国产高清美女在线观看| 色窝窝免费一区二区三区 | 一个人看的在线免费视频| 久久丫精品国产亚洲av| 免费一级毛片在线播放|