posts - 36, comments - 419, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
          http請(qǐng)求頭的數(shù)據(jù)量

              我們先分析下請(qǐng)求頭,看看每次請(qǐng)求都帶了那些額外的數(shù)據(jù).下面是監(jiān)控的google的請(qǐng)求頭

              Host www.google.com.hk
              User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 GTBDFff GTB7.0
              Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
              Accept-Language zh-cn,en-us;q=0.7,en;q=0.3
              Accept-Encoding gzip,deflate
              Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
              Keep-Alive 115
              Proxy-Connection keep-alive

             返回的response head

             Date Sat, 17 Apr 2010 08:18:18 GMT
             Expires -1
            Cache-Control private, max-age=0
             Content-Type text/html; charset=UTF-8
             Set-Cookie PREF=ID=b94a24e8e90a0f50:NW=1:TM=1271492298:LM=1271492298:S=JH7CxsIx48Zoo8Nn; expires=Mon, 16-Apr-2012 08:18:18 GMT; path=/;    domain=.google.com.hk NID=33=EJVyLQBv2CSgpXQTq8DLIT2JQ4aCAE9YKkU2x-h4hVw_ATrGx7njA69UUBMbzVHVnkAOe_jlGGzOoXhQACSFDP1i53C8hWjRTJd0vYtRNWhGYGv491mwbngkT6LCYbvg; expires=Sun, 17-Oct-2010 08:18:18 GMT; path=/;   domain=.google.com.hk; HttpOnly
             Content-Encoding gzip
           Server gws
           Content-Length 4344

             這里發(fā)送的請(qǐng)求頭的大小大概420 bytes,返回的請(qǐng)求頭大概 600 bytes。
              
             可見每次請(qǐng)求都會(huì)帶上一些額外的信息進(jìn)行傳輸(這次請(qǐng)求中還沒有帶cookie),當(dāng)請(qǐng)求的資源很小,比如1個(gè)不到1k的圖標(biāo),可能request帶的數(shù)據(jù)比實(shí)際圖標(biāo)的數(shù)據(jù)量還大。
             
             所以當(dāng)請(qǐng)求越多的時(shí)候,在網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)自然就多,傳輸速度自然就慢了。
            
             其實(shí)request自帶的數(shù)據(jù)量還是小問題,畢竟request能帶的數(shù)據(jù)量還是有限的。
            
          http連接的開銷

             相比request頭部多余的數(shù)據(jù),http連接的開銷則更加嚴(yán)重。先看看從用戶輸入1個(gè)URL到下載內(nèi)容到客戶端需要經(jīng)過哪些階段:
             1. 域名解析
             2. 開啟TCP連接 
             3. 發(fā)送請(qǐng)求 
             4. 等待(主要包括網(wǎng)絡(luò)延遲和服務(wù)器處理時(shí)間)
             5. 下載資源
             
             可能很多人認(rèn)為每次請(qǐng)求大部分時(shí)間都花在下載資源上,讓我們看看blogjava資源下載瀑布圖(每種顏色代表的階段與上面5個(gè)階段對(duì)應(yīng)):
              
             

             看了上圖你可能驚訝,花費(fèi)在等待階段的時(shí)間比實(shí)際下載的時(shí)間要多的多,上圖告訴我們:
                1. 每次請(qǐng)求花費(fèi)的大部分時(shí)間在其他階段,而不是在下載資源階段
                2. 再小的資源照樣會(huì)花費(fèi)很多時(shí)間在其他階段,只是下載階段會(huì)比較短(見上圖的第6個(gè)資源,才284Byte)。
                

            正對(duì)上面提到的2種情況,我們應(yīng)該要怎么進(jìn)行優(yōu)化了?減少請(qǐng)求數(shù)來減少其他階段的花銷和網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)。

             
          如何減少請(qǐng)求數(shù)

            
          1、合并文件
               合并文件就是把很多JS文件合并成1個(gè)文件,很多CSS文件合并成1個(gè)文件,這種方法應(yīng)該很多人用到過,這里不做詳細(xì)介紹,
               只推薦1個(gè)合并的工具:yuiCompressor 這個(gè)工具yahoo提供的。 http://developer.yahoo.com/yui/compressor/
            
            2、合并圖片
               這是利用css sprite,通過控制背景圖片的位置來顯示不同的圖片。這種技術(shù)也是大家都用過的,不做詳細(xì)介紹,推薦1個(gè)在線合并圖片的網(wǎng)站:http://csssprites.com/
               
            3、把JS、CSS合并到1個(gè)文件
               上面第1種方法說的只是把幾個(gè)JS文件合并成1個(gè)JS文件,幾個(gè)CSS文件合并成1個(gè)CSS文件,哪如何把CSS和JS都合并到1個(gè)文件中,見我的另1篇文章:
               http://www.aygfsteel.com/BearRui/archive/2010/04/18/combin_css_js.html
               
            4、使用Image maps
               Image maps 是把多個(gè)圖片合并成1個(gè)圖片,然后使用html中的<map>標(biāo)簽連接圖片,并實(shí)現(xiàn)點(diǎn)擊圖片不同的區(qū)域執(zhí)行不同的動(dòng)作,image map在導(dǎo)航條中比較容易使用到。
               image map的使用方法見: http://www.w3.org/TR/html401/struct/objects.html#h-13.6
            
            5、data嵌入圖片
               這種方法把圖片進(jìn)行編碼直接嵌入到html中進(jìn)行使用,以減少HTTP請(qǐng)求,但這個(gè)會(huì)增加HTML頁面的大小,而且這樣嵌入的圖片不能緩存。見下面這個(gè)圖片:
            
                
               上面的圖片就是把圖片進(jìn)行base64編碼后使用data:嵌入到html中,代碼如下(后面的省略了,大家可以查看源代碼看):
               <IMG SRC="data:image/gif;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4QAWRXhpZgAASUkqAAgAA......">

               其中g(shù)oogle的視頻搜索中,搜索出來的視頻縮略圖就都是使用嵌入的圖片的,見下圖:
               
                 
            
             
              
                 以上幾種方法在都有利有弊,在不同情況下可以選擇不同的使用方式,比如使用data嵌入圖片雖然減少了請(qǐng)求數(shù),但會(huì)增加頁面大小。

          所以微軟的bing搜索在用戶第一次訪問的時(shí)候使用data嵌入圖片,然后后臺(tái)懶加載真真的圖片,以后訪問就直接使用緩存的圖片,而不使用data。

              有需要請(qǐng)查 看:高性能WEB開發(fā)系列

          [作者]:BearRui(AK-47)
          [博客]: http://www.aygfsteel.com/bearrui/
          [聲明]:本博所有文章版權(quán)歸作者所有(除特殊說明以外),轉(zhuǎn)載請(qǐng)注明出處.
          英雄,別走啊,幫哥評(píng)論下:  

          精彩推薦 好文要頂 水平一般 看不懂 還需努力

          評(píng)論

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-04-18 19:38 by sevenduan
          減少請(qǐng)求一般是為了提高頁面渲染速度吧,瀏覽器支持的并發(fā)連接有限。
          為了減少請(qǐng)求可以合并文件,server端的文件合并解決方案可以用jawr。
          也可以考慮異步加載文件 或者 按需加載文件來減少渲染階段的請(qǐng)求。僅供參考。

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-04-18 19:47 by BearRui(AK-47)
          @sevenduan
          渲染速度 跟請(qǐng)求數(shù)沒直接關(guān)系,瀏覽器會(huì)根據(jù)HTML代碼生成DOM樹,并解析CSS來渲染頁面,所以DOM數(shù)的復(fù)雜度,CSS文件的加載,解析速度比較影響渲染速度,當(dāng)然還會(huì)有其他因素,比如JS文件對(duì)DOM的修改等等。只能說請(qǐng)求數(shù)少了,頁面加載快了,瀏覽器可以提前進(jìn)行渲染,不用等待太多資源。

          其實(shí)說白了,目的都是一樣,就是為了讓頁面盡快加載完呈現(xiàn)給用戶。請(qǐng)求數(shù)可能更加影響資源加載階段。 ^_^

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-04-19 13:54 by sevenduan
          @BearRui(AK-47)
          恩,render phase只是一個(gè)步驟,目的都是用戶體驗(yàn)加速響應(yīng)。
          一個(gè)頁面的加載渲染可以分批進(jìn)行。
          初始化加載渲染后,
          可以繼續(xù)延遲加載或者異步加載,依次渲染頁面。
          關(guān)注中……

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-04-19 14:21 by BearRui(AK-47)
          @sevenduan
          目前對(duì)網(wǎng)絡(luò)的優(yōu)化主要在資源加載這塊,等有時(shí)間好好研究下頁面熏染的優(yōu)化,在寫點(diǎn)心得體會(huì)。

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-04-23 11:45 by 蔣家狂潮
          好文!

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-04-23 12:05 by BearRui(AK-47)
          @蔣家狂潮
          thanks ^_^

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-05-12 12:57 by 神級(jí)菜鳥
          JS與CSS合拼的方法并不可取,當(dāng)你要管理JS時(shí)卻要連同CSS一齊管理,而且如果一個(gè)頁面引用一個(gè)JS庫,而這個(gè)JS庫里還要包含CSS。這樣做更得不償失

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-05-12 13:02 by BearRui(AK-47)
          S與CSS合并在一起,不是特別好,我認(rèn)為主要不是因?yàn)椴缓霉芾恚菫g覽器的支持問題。管理其實(shí)很簡單,因?yàn)殚_發(fā)的時(shí)候都是分開進(jìn)行開發(fā),只是在部署的時(shí)候使用工具進(jìn)行統(tǒng)一合并,如何統(tǒng)一合并可參考我這篇文章:
          http://www.aygfsteel.com/BearRui/archive/2010/05/04/js_css_merge_compress_cache.html

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-05-12 14:05 by qml007
          那,首頁呈現(xiàn)時(shí),A,一次請(qǐng)求,服務(wù)器返回所有 html代碼;B,服務(wù)器先釋出基本的靜態(tài)html,然後用多個(gè)ajax請(qǐng)求進(jìn)行其餘html代碼的呈現(xiàn)。 哪種方法會(huì)好些?各有什麼優(yōu)劣?

          # re: 高性能WEB開發(fā) - 為什么要減少請(qǐng)求數(shù),如何減少請(qǐng)求數(shù)!  回復(fù)  更多評(píng)論   

          2010-05-12 14:16 by BearRui(AK-47)
          @qml007
          這個(gè)我覺的主要決定于你頁面的內(nèi)容,如果你的動(dòng)態(tài)html代碼要花一些時(shí)間的話,建議先顯示部分html,然后用ajax加載其他的來呈現(xiàn)。如果你的動(dòng)態(tài)內(nèi)容使用緩存能很快生成,則一次請(qǐng)求OK

          記住要用戶第一,不能讓用戶在空白頁面中等很久,因?yàn)榭瞻醉撁嬗脩艨赡芤詾橄到y(tǒng)出問題,使用ajax至少可以提醒用戶系統(tǒng)真正處理。
          主站蜘蛛池模板: 万安县| 新巴尔虎左旗| 淮滨县| 孟津县| 游戏| 武陟县| 巴东县| 东丽区| 镇原县| 台北市| 资中县| 西吉县| 本溪市| 顺昌县| 南靖县| 忻城县| 南皮县| 巴彦淖尔市| 金坛市| 兴化市| 晋中市| 扎兰屯市| 濮阳市| 稷山县| 康乐县| 宝鸡市| 四会市| 微山县| 鄂尔多斯市| 彰化市| 独山县| 禹城市| 剑阁县| 开原市| 同德县| 宿松县| 望城县| 华蓥市| 五寨县| 翁牛特旗| 南川市|