前言
網站設計的優化是一個很大的話題,有一些通用的原則,也有針對不同開發平台的一些建議。這方面的研究一直沒有停止過,我在不同的場合也分享過這樣的話題。
作為通用的原則,雅虎的工程師團隊曾經給出過35個最佳實踐。這個列表請參考
Best Practices for Speeding Up Your Web Site http://developer.yahoo.com/performance/rules.html
同時,他們還發布了一個相應的測試工具Yslow http://developer.yahoo.com/yslow/
我強烈推薦所有的網站開發人員都應該學習這些最佳實踐,並結合自己的實際項目情況進行應用。
接下來的一段時間,我將結合ASP.NET這個開發平台,針對這些原則,通過一個系列文章的形式,做些講解和演繹,以幫助大家更好地理解這些原則,並且更好地使用他們。
准備工作
為了跟隨我進行后續的學習,你需要准備如下的開發環境和工具
- Google Chrome 或者firefox ,並且安裝 Yslow這個擴展組件.請注意,這個組件是雅虎提供的,但目前沒有針對IE的版本。
- https://chrome.google.com/webstore/detail/yslow/ninejjcohidippngpapiilnmkgllmakh
Technorati Tags: Performance,Web design,ASP.NET
- https://addons.mozilla.org/en-US/firefox/addon/yslow/
- 你應該對這些瀏覽器的開發人員工具有所了解,你可以通過按下F12鍵調出這個工具。
- https://chrome.google.com/webstore/detail/yslow/ninejjcohidippngpapiilnmkgllmakh
- Visaul Studio 2010 SP1 或更高版本,推薦使用Visual Studio 2012
- 你需要對ASP.NET的開發基本流程和核心技術有相當的了解,本系列文章很難對基礎知識做普及。
本文要討論的話題
這一篇我和大家討論第九個原則:Reduce DNS Lookups(減少DNS查找的次數)。
DNS查找是一個較為底層的行為,我們在瀏覽器中輸入某個地址,例如http://www.cnblogs.com ,我們的瀏覽器要能正確地定位到博客園的服務器之前,就必須對這個域名進行解析,很顯然它自己是無法解析的,所以它需要通過一定的機制進行查找,這就是為什么我們通常上網之前需要設置DNS服務器的原因。
查找DNS是需要花費時間的,經驗的總結是至少需要20毫秒左右的時間。在此期間,瀏覽器是無法下載其他任何內容資源的。所以瀏覽器會想辦法對DNS的查找結果進行緩存。而除了瀏覽器的緩存之外,操作系統(例如Windows)也會對DNS查詢的結果做緩存。只不過,由於瀏覽器使用太過頻繁,目前的主流瀏覽器都使用自己獨有的緩存,而不使用操作系統的緩存。
- IE 中默認情況下對DNS的緩存時間為 30分鍾。關於如何配置,可以通過閱讀這篇文章了解更多信息。
- 早期的版本設置為1天,與Windows的設置一致。
- Windows的DNS緩存,可以通過ipconfig /displaydns 這個命令來查看。
- Firefox默認的DNS緩存時間據說為1分鍾,如果不滿意這個選項,直接修改 network.dnsCacheExpiration 即可。
- Google Chrome默認的DNS緩存時間,據我觀察也是1分鍾,可以通過chrome://net-internals/#dns 這個地址查看。
我們可以看到即便同樣為瀏覽器,它們在緩存DNS的問題上也不盡相同(主要體現在時間上面),這個差異到底有什么考慮呢?
- 緩存時間較長,有利於重復利用DNS緩存,提高速度。
- 緩存時間較短,有利於及時地檢測到目標站點的IP地址更新,以進行正確的訪問。
所以,兩者都有其優點和考慮。
那么,講了這么多,了解這個只是對於我們網站設計和優化有何啟示呢?
- 由於DNS查找是需要時間的,而且它們通常都是只緩存一定的時間,所以應該盡可能地減少DNS查找的次數。
- 減少DNS查找次數,最理想的方法就是將所有的內容資源都放在同一個域(Domain)下面,這樣訪問整個網站就只需要進行一次DNS查找,這樣可以提高性能。
- 但理想總歸是理想,上面的理想做法會帶來另外一個問題,就是由於這些資源都在同一個域,而HTTP /1.1 中推薦客戶端針對每個域只有一定數量的並行度(它的建議是2),那么就會出現下載資源時的排隊現象,這樣就會降低性能。
- 所以,折衷的做法是:建議在一個網站里面使用至少2個域,但不多於4個域來提供資源。我認為這條建議是很合理的,也值得我們在項目實踐中去應用。
我們最后可以來看看博客園主頁在這方面的設計
我們看到加載主頁的時候,會有47個請求,這些請求分布在不同的主機(HOST),去除重復值之后,有如下11個主機。前5個是與博客園本身有關的,后6個是與廣告有關的。
www.cnblogs.com
common.cnblogs.com
static.cnblogs.com
pic.cnitblog.com
passport.cnblogs.com
www.google-analytics.com
partner.googleadservices.com
pubads.g.doubleclick.net
static.googleadsserving.cn
csi.gstatic.com
p4-gg6ayhm2r5hvm-ukushuadvfiqpnzm-if-v6exp3-v4.metric.gstatic.com