婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > AJAX 客戶端響應(yīng)速度提高分析

AJAX 客戶端響應(yīng)速度提高分析

熱門標(biāo)簽:接聽電話機(jī)器人哪有 蓄意標(biāo)記地圖標(biāo)注 察縣地圖標(biāo)注 信貸電銷機(jī)器人有用嗎 如何用地圖標(biāo)注各分公司 電銷機(jī)器人適用范圍 廣西ai語音電銷機(jī)器人哪家好 辦理一個400電話多少錢 莆田防封電銷卡價格
理論上AJAX技術(shù)在很大的程度上可以減少用戶操作的等待時間,同時節(jié)約網(wǎng)絡(luò)上的數(shù)據(jù)流量。而然,實(shí)際情況卻并不總是這樣。用戶時常會抱怨用了AJAX的系統(tǒng)響應(yīng)速度反而降低了。
  筆者從事AJAX方面的研發(fā)多年,參與開發(fā)了目前國內(nèi)較為成熟的AJAX平臺-dorado。根據(jù)筆者的經(jīng)驗(yàn),導(dǎo)致這種結(jié)果的根本原因并不在AJAX。很多時候系統(tǒng)響應(yīng)速度的降低都是由不夠合理的界面設(shè)計和不夠高效的編程習(xí)慣造成的。下面我們就來分析幾個AJAX開發(fā)過程中需要時刻注意的環(huán)節(jié)。
  合理的使用客戶端編程和遠(yuǎn)程過程調(diào)用
  客戶端的編程主要都是基于JavaScript的。而JavaScript是一種解釋型的編程語言,它的運(yùn)行效率相對于Java等都要稍遜一籌。同時JavaScript又是運(yùn)行在瀏覽器這樣一個嚴(yán)格受限的環(huán)境當(dāng)中。因此開發(fā)人員對于哪些邏輯可以在客戶端執(zhí)行應(yīng)該有一個清醒的認(rèn)識。
  在實(shí)際的應(yīng)用中究竟應(yīng)該怎樣使用客戶端編程,這依賴于開發(fā)人員的經(jīng)驗(yàn)判斷。這里很多問題是只可意會的。由于篇幅有限,在這里我們大致歸納出下面這幾個注意事項(xiàng):
  盡可能避免頻繁的使用遠(yuǎn)程過程調(diào)用,例如避免在循環(huán)體中使用遠(yuǎn)程過程調(diào)用。
  如果可能的話盡可能使用AJAX方式的遠(yuǎn)程過程調(diào)用(異步方式的遠(yuǎn)程過程調(diào)用)。
  避免將重量級的數(shù)據(jù)操作放置在客戶端。例如:大批量的數(shù)據(jù)復(fù)制操作、需要通過大量的數(shù)據(jù)遍歷完成的計算等。
  改進(jìn)對DOM對象的操作方式。
  客戶端的編程中,對DOM對象的操作往往是最容易占用CPU時間的。而對于DOM對象的操作,不同的編程方法之間的性能差異又往往是非常大的。
  以下是三段運(yùn)行結(jié)果完全相同的代碼,它們的作用是在網(wǎng)頁中創(chuàng)建一個10x1000的表格。然而它們的運(yùn)行速度卻有著天壤之別。
復(fù)制代碼 代碼如下:

/* 測試代碼1 - 耗時: 41秒*/
var table = document.createElement("TABLE");
document.body.appendChild(table);
for(var i = 0; i 1000; i++){
var row = table.insertRow(-1);
for(var j = 0; j 10; j++){
var cell = objRow.insertCell(-1);
cell.innerText = "( " + i + " , " + j + " )";
}
}
/* 測試代碼2 - 耗時: 7.6秒 */
var table = document.getElementById("TABLE");
document.body.appendChild(table);
var tbody = document.createElement("TBODY");
table.appendChild(tbody);
for(var i = 0; i 1000; i++){
var row = document.createElement("TR");
tbody.appendChild(row);
for(var j = 0; j 10; j++){
var cell = document.createElement("TD");
row.appendChild(cell);
cell.innerText = "( " + i + " , " + j + " )";
}
}
/* 測試代碼3 - 耗時: 1.26秒 */
var tbody = document.createElement("TBODY");
for(var i = 0; i 1000; i++){
var row = document.createElement("TR");
for(var j = 0; j 10; j++){
var cell = document.createElement("TD");
cell.innerText = "( " + i + " , " + j + " )";
row.appendChild(cell);
}
tbody.appendChild(row);
}
var table = document.getElementById("TABLE");
table.appendChild(tbody);
document.body.appendChild(table);

  這里的“測試代碼1”和“測試代碼2”之間的差別在于在創(chuàng)建表格單元時使用了不同的API方法。而“測試代碼2”和“測試代碼3” 之間的差別在于處理順序的略微不同。
  “測試代碼1”和“測試代碼2”之間如此大的性能差別我們無從分析,目前所知的是insertRow和insertCell是DHTML中表格特有的 API,createElement和appendChild是W3C DOM的原生API。而前者應(yīng)該是對后者的封裝。不過,我們并不能因此而得出結(jié)論認(rèn)為DOM的原生API總是優(yōu)于對象特有的API。建議大家在需要頻繁調(diào)用某一API時,對其性能表現(xiàn)做一些基本的測試。
  “測試代碼2”和“測試代碼3”之間的性能差異主要來自于他們的構(gòu)建順序不同。“測試代碼2”的做法是首先創(chuàng)建最外層的TABLE>對象,然后再在循環(huán)中依次創(chuàng)建TR>和TD>。而“測試代碼3”的做法是首先在內(nèi)存中由內(nèi)到外的構(gòu)建好整個表格,最后再將它添加到網(wǎng)頁中。這樣做的目的是盡可能的減少瀏覽器重新計算頁面布局的次數(shù)。每當(dāng)我們將一個對象添加到網(wǎng)頁中時,瀏覽器都會嘗試對頁面中的控件的布局進(jìn)行重新計算。所以,如果我們能夠首先在內(nèi)存中將整個要構(gòu)造的對象全部創(chuàng)建好,然后再一次性的添加到網(wǎng)頁中。那么,瀏覽器將只會做一次布局的重計算。總結(jié)為一句話那就是越晚執(zhí)行appendChild越好。有時為了提高運(yùn)行效率,我們甚至可以考慮先使用 removeChild將已存在的控件從頁面中移除,然后構(gòu)造完成后再重新將其放置回頁面當(dāng)中。
  提高字符串累加的速度
  在使用AJAX提交信息時,我可能常常需要拼裝一些比較大的字符串通過XmlHttp來完成POST提交。盡管提交這樣大的信息的做法看起來并不優(yōu)雅,但有時我們可能不得不面對這樣的需求。那么JavaScript中對字符串的累加速度如何呢?我們先來做下面的這個實(shí)驗(yàn)。累加一個長度為30000的字符串。
復(fù)制代碼 代碼如下:

/* 測試代碼1 - 耗時: 14.325秒 */
var str = "";
for (var i = 0; i 50000; i++) {
str += "xxxxxx";
}

  這段代碼耗時14.325秒,結(jié)果并不理想。現(xiàn)在我們將代碼改為如下的形式:
復(fù)制代碼 代碼如下:

/* 測試代碼2 - 耗時: 0.359秒 */
var str = "";
for (var i = 0; i 100; i++) {
var sub = "";
for (var j = 0; j 500; j++) {
sub += "xxxxxx";
}
str += sub;
}

  這段代碼耗時0.359秒!同樣的結(jié)果,我們做的只是首先拼裝一些較小的字符串然后再組裝成更大的字符串。這種做法可以有效的在字符串拼裝的后期減小內(nèi)存復(fù)制的數(shù)據(jù)量。知道了這一原理之后我們還可以把上面的代碼進(jìn)一步拆散以后進(jìn)行測試。下面的代碼僅耗時0.140秒。
復(fù)制代碼 代碼如下:

/* 測試代碼3 - 耗時: 0.140秒 */
var str = "";
for (var i1 = 0; i1 5; i1++) {
var str1 = "";
for (var i2 = 0; i2 10; i2++) {
var str2 = "";
for (var i3 = 0; i3 10; i3++) {
var str3 = "";
for (var i4 = 0; i4 10; i4++) {
var str4 = "";
for (var i5 = 0; i5 10; i5++) {
str4 += "xxxxxx";
}
str3 += str4;
}
str2 += str3;
}
str1 += str2;
}
str += str1;
}

  不過,上面這種做法也許并不是最好的!如果我們需要提交的信息是XML格式的(其實(shí)絕大多數(shù)情況下,我們都可以設(shè)法將要提交的信息組裝成XML格式),我們還能找到更高效更優(yōu)雅的方法—利用DOM對象為我們組裝字符串。下面這段代買組裝一個長度為950015的字符串僅須耗時0.890秒。
復(fù)制代碼 代碼如下:

/* 利用DOM對象組裝信息 - 耗時: 0.890秒 */
var xmlDoc;
if (browserType == BROWSER_IE) {
xmlDoc = new ActiveXObject("Msxml.DOMDocument");
}
else {
xmlDoc = document.createElement("DOM");
}
var root = xmlDoc.createElement("root");
for (var i = 0; i 50000; i++) {
var node = xmlDoc.createElement("data");
if (browserType == BROWSER_IE) {
node.text = "xxxxxx";
}
else {
node.innerText = "xxxxxx";
}
root.appendChild(node);
}
xmlDoc.appendChild(root);
var str;
if (browserType == BROWSER_IE) {
str = xmlDoc.xml;
}
else {
str = xmlDoc.innerHTML;
}

  避免DOM對象的內(nèi)存泄漏
  關(guān)于IE中DOM對象的內(nèi)存泄露是一個常常被開發(fā)人員忽略的問題。然而它帶來的后果卻是非常嚴(yán)重的!它會導(dǎo)致IE的內(nèi)存占用量持續(xù)上升,并且瀏覽器的整體運(yùn)行速度明顯下降。對于一些泄露比較嚴(yán)重的網(wǎng)頁,甚至只要刷新幾次,運(yùn)行速度就會降低一倍。
  比較常見的內(nèi)存泄漏的模型有“循環(huán)引用模型”、“閉包函數(shù)模型”和“DOM插入順序模型”,對于前兩種泄漏模型,我們都可以通過在網(wǎng)頁析構(gòu)時解除引用的方式來避免。而對于“DOM插入順序模型”則需要通過改變一些慣有的編程習(xí)慣的方式來避免。
  有關(guān)內(nèi)存泄漏的模型的更多介紹可以通過Google很快的查到,本文不做過多的闡述。不過,這里我向您推薦一個可用于查找和分析網(wǎng)頁內(nèi)存泄露的小工具——Drip,目前的較新版本是0.5,下載地址是http://outofhanwell.com/ieleak/index.php。
  復(fù)雜頁面的分段裝載和初始化
  對系統(tǒng)當(dāng)中某些確實(shí)比較復(fù)雜而又不便使用IFrame的界面,我們可以對其實(shí)施分段裝載。例如對于多頁標(biāo)簽的界面,我們可以首先下載和初始化多頁標(biāo)簽的默認(rèn)頁,然后利用AJAH(asynchronous JavaScript and HTML)技術(shù)來異步的裝載其他標(biāo)簽頁中的內(nèi)容。這樣就能保證界面可以在第一時間首先展現(xiàn)給用戶。把整個復(fù)雜界面的裝載過程分散到用戶的操作過程當(dāng)中。
  利用GZIP壓縮網(wǎng)絡(luò)流量
  除了上面提到的這些代碼級的改良之外,我們還可以利用GZIP來有效的降低網(wǎng)絡(luò)流量。目前常見的主流瀏覽器已經(jīng)全部支持GZIP算法,我們往往只需要編寫少量的代碼就可以支持GZIP了。例如在J2EE中我們可以在Filter中通過下面的代碼來判斷客戶端瀏覽器是否支持GZIP算法,然后根據(jù)需要利用 java.util.zip.GZIPOutputStream來實(shí)現(xiàn)GZIP的輸出。
復(fù)制代碼 代碼如下:

/* 判斷瀏覽器對GZIP支持方式的代碼 */
private static String getGZIPEncoding(HttpServletRequest request) {
String acceptEncoding = request.getHeader("Accept-Encoding");
if (acceptEncoding == null) return null;
acceptEncoding = acceptEncoding.toLowerCase();
if (acceptEncoding.indexOf("x-gzip") >= 0) return "x-gzip";
if (acceptEncoding.indexOf("gzip") >= 0) return "gzip";
return null;
}

  一般而言,GZIP對于HTML、JSP的壓縮比可以達(dá)到80%左右,而它造成的服務(wù)端和客戶端的性能損耗幾乎是可以忽略的。結(jié)合其他因素,支持GZIP 的網(wǎng)站有可能為我們節(jié)約50%的網(wǎng)絡(luò)流量。因此GZIP的使用可以為那些網(wǎng)絡(luò)環(huán)境不是特別好的應(yīng)用帶來顯著的性能提升。使用Http的監(jiān)視工具Fiddler可以方便的檢測出網(wǎng)頁在使用GZIP前后的通訊數(shù)據(jù)量。(Fiddler的下載地址是http://www.fiddlertool.com/fiddler/)
  關(guān)于Web應(yīng)用的性能優(yōu)化其實(shí)是一個非常大的話題。本文由于篇幅有限,只能涉及其中的幾個細(xì)節(jié),并且也無法將這些細(xì)節(jié)的優(yōu)化方式全面的展現(xiàn)給大家。期望本文能夠引起大家對Web應(yīng)用尤其是客戶端性能優(yōu)化的充分重視。畢竟服務(wù)端編程技巧已為大家熟知多年,在服務(wù)端挖掘性能的潛力已經(jīng)不大了。而在客戶端的方法改進(jìn)往往能夠得到令人驚奇的性能提升。
您可能感興趣的文章:
  • Js中使用hasOwnProperty方法檢索ajax響應(yīng)對象的例子
  • thinkphp中ajax與php響應(yīng)過程詳解
  • ajax與302響應(yīng)代碼測試
  • jQuery的Ajax時無響應(yīng)數(shù)據(jù)的解決方法
  • Ajax獲取響應(yīng)內(nèi)容長度的方法

標(biāo)簽:益陽 張掖 延邊 儋州 銅陵 鷹潭 阿拉善盟

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《AJAX 客戶端響應(yīng)速度提高分析》,本文關(guān)鍵詞  AJAX,客戶端,響應(yīng),速度,提高,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《AJAX 客戶端響應(yīng)速度提高分析》相關(guān)的同類信息!
  • 本頁收集關(guān)于AJAX 客戶端響應(yīng)速度提高分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美一区欧美二区| 亚洲人成在线播放网站岛国| 精品国产乱码91久久久久久网站| 欧美激情综合在线| 婷婷一区二区三区| 94-欧美-setu| 久久午夜老司机| 午夜精品久久久久久久久| 成人免费视频一区二区| 欧美videofree性高清杂交| 亚洲国产精品久久人人爱蜜臀| 国产99久久久国产精品潘金| 欧美妇女性影城| 亚洲欧美二区三区| 成人深夜在线观看| 国产日韩欧美精品综合| 日本免费新一区视频| 一本大道av伊人久久综合| 久久久亚洲精华液精华液精华液| 免费在线看成人av| 欧美肥妇毛茸茸| 视频一区欧美日韩| 欧美高清视频www夜色资源网| 中文字幕一区二区三区四区 | 精品国产网站在线观看| 五月婷婷综合在线| 欧美日韩免费一区二区三区视频| 国产亚洲精品中文字幕| 国模无码大尺度一区二区三区| 日韩欧美一区二区久久婷婷| 日韩精品国产欧美| 欧美精品亚洲二区| 日本最新不卡在线| 日韩精品最新网址| 国产精品一区在线观看你懂的| 精品1区2区在线观看| 精品一区二区日韩| 久久久久久一二三区| 福利电影一区二区三区| 国产精品乱码妇女bbbb| 91一区在线观看| 亚洲视频免费在线观看| 色屁屁一区二区| 亚洲一区二区偷拍精品| 777色狠狠一区二区三区| 美女视频免费一区| 久久九九全国免费| 91丨porny丨国产| 亚洲国产精品影院| 欧美精品一区二区三区高清aⅴ| 韩国女主播成人在线| 国产精品色眯眯| 欧洲国内综合视频| 奇米色一区二区| 国产视频一区二区在线观看| 色综合久久综合网97色综合 | 尤物视频一区二区| 欧美精品日韩综合在线| 精品一区二区成人精品| 国产精品电影一区二区| 欧美蜜桃一区二区三区| 国产一区三区三区| 亚洲天堂成人在线观看| 欧美一级国产精品| 成人福利电影精品一区二区在线观看| 亚洲黄色在线视频| 久久一区二区三区四区| 欧美亚洲动漫精品| 国产在线视频精品一区| 一区二区三区蜜桃| 久久精品亚洲一区二区三区浴池 | 91丝袜美腿高跟国产极品老师| 一区二区三区波多野结衣在线观看 | 久久9热精品视频| 亚洲欧美自拍偷拍色图| 日韩亚洲国产中文字幕欧美| 成+人+亚洲+综合天堂| 日本在线不卡一区| 亚洲欧美另类在线| 国产亚洲成aⅴ人片在线观看 | 欧美国产精品一区二区三区| 88在线观看91蜜桃国自产| 99在线精品观看| 国模套图日韩精品一区二区 | 久久综合久色欧美综合狠狠| 欧美中文字幕亚洲一区二区va在线| 精彩视频一区二区| 日韩电影免费在线看| 亚洲欧美另类在线| 国产精品国产精品国产专区不片| 日韩欧美在线网站| 欧美日韩精品一区二区天天拍小说 | 欧美日本一区二区三区| 99久久99久久综合| 成人免费视频视频在线观看免费 | 久草热8精品视频在线观看| 亚洲午夜精品在线| 中文字幕一区二区三区四区不卡 | 精品国产亚洲一区二区三区在线观看| 欧美日韩在线电影| 91蝌蚪porny九色| 成人综合在线观看| 国产精品一区二区你懂的| 奇米影视在线99精品| 偷偷要91色婷婷| 亚洲大片一区二区三区| 亚洲一区二区精品久久av| 亚洲欧美另类久久久精品2019| 国产精品美女久久久久久久久 | 国产美女在线精品| 国产综合久久久久久鬼色 | 久久综合久久综合久久| 欧美成人艳星乳罩| 精品久久一区二区三区| 久久亚洲春色中文字幕久久久| 2020国产精品久久精品美国| 日韩欧美国产精品一区| 日韩一级片在线播放| 精品国产3级a| 久久久久国产精品麻豆ai换脸| 国产午夜精品福利| 中文字幕 久热精品 视频在线| 国产精品进线69影院| 久久视频一区二区| 国产精品护士白丝一区av| 日韩理论片中文av| 亚洲成人综合在线| 麻豆视频一区二区| 成人一区在线看| 日本韩国精品一区二区在线观看| 欧美揉bbbbb揉bbbbb| 日韩欧美精品在线视频| 国产女同性恋一区二区| 一区二区三区美女| 麻豆成人免费电影| 成人开心网精品视频| 91成人网在线| 日韩精品在线一区二区| 中文乱码免费一区二区| 天堂一区二区在线免费观看| 精品一区二区三区欧美| 99精品国产热久久91蜜凸| 欧美精选午夜久久久乱码6080| 2020日本不卡一区二区视频| 亚洲欧美日韩久久| 秋霞av亚洲一区二区三| 国产成人h网站| 欧美优质美女网站| 久久女同互慰一区二区三区| 亚洲天堂av一区| 久久av老司机精品网站导航| 色综合中文字幕| 精品毛片乱码1区2区3区| 综合激情网...| 麻豆免费精品视频| 色婷婷国产精品| 国产午夜精品在线观看| 日韩激情视频网站| 91热门视频在线观看| 日韩欧美美女一区二区三区| 一区二区三区在线影院| 国产精品66部| 欧美妇女性影城| 亚洲男女一区二区三区| 国产一区二区三区高清播放| 欧美久久一区二区| 亚洲伦在线观看| 成人av综合在线| 久久久久久久久久看片| 日韩av一区二区三区| 播五月开心婷婷综合| 久久先锋资源网| 久久97超碰色| 91精品视频网| 亚洲成人久久影院| 91在线无精精品入口| 亚洲国产岛国毛片在线| 精品综合免费视频观看| 538在线一区二区精品国产| 一区二区在线看| 91麻豆成人久久精品二区三区| 中文字幕电影一区| 国产精品中文字幕日韩精品 | 亚洲午夜激情av| 91女人视频在线观看| 国产精品无人区| 99久久精品情趣| 一区在线中文字幕| 99久久精品国产一区二区三区| 国产精品免费免费| 成人av在线播放网址| 中文av一区二区| 91在线视频在线| 一区二区三区在线免费视频 | 午夜精品aaa| 欧美色成人综合| 日韩国产精品久久久| 欧美精品一二三| 日本欧美韩国一区三区| 精品国产精品网麻豆系列|