【編者按】本文做者爲 DZone 社區的最具價值博主(MVB) Jonathan Danylko,主要介紹爲 ASP.NET MVC 應用提速的十種方法。由國內 ITOM 管理平臺 OneAPM 編譯呈現,如下爲正文。javascript
每一個人都想快速掌握最新消息。css
我是說,人們巴不得預知次日的頭條。沒有人喜歡等待。html
排隊等待,遇到紅燈要等待,開個網頁要等待,等等等。前端
理所固然,沒有人喜歡等待網頁慢吞吞地加載,尤爲是在移動端訪問網站時。其實,Web 開發者敏感的神經決定了咱們等待與否。java
如今,快速響應不只是來自用戶的要求,仍是決定 Google 搜索排名的主要因素。除此以外,Google 還大力推行 Google AMP 計劃,以使網站加載更加快速。web
考慮到大多數網站都存在速度方面的問題,筆者想經過此文幫助 Microsoft 開發者優化他們的網站。ajax
在本文中,筆者將介紹十種爲 ASP.NET MVC 應用提速的方法。數據庫
緩存一直都是優化應用時屢試不爽的最後絕招。只要使用得當,緩存絕對能夠有效加速應用。編程
在進行數據庫調用以檢索記錄時,正是實現應用程序緩存的最佳時機。瀏覽器
譬如說,你搭建了一個博客。當訪客請求某一篇博文時,你將其從數據庫中檢索出來,保存在緩存中。當下一個訪客經過 ID 請求同一篇博文時,應用程序會首先根據 ID 在緩存中尋找博文,若是找到,就將之返回給訪客,而無需訪問數據庫。
這節省了數據庫調用的高昂開支。
延伸閱讀:經過添加簡單的緩存層以實現高效快速的網站
以前,筆者從未了解過圖片在一篇博文中會佔據多大比重。有時候,取決於文章內容的不一樣,圖片可能會是一篇博文中最大的資源。
你應該壓縮這些龐大的資源。圖片越小,網頁渲染的速度越快。
Image Optimizer(圖片優化)插件是頗有用的 Visual Studio 插件。選定你的全部圖像,再選擇無損(Lossless)或者有損(Lossy)圖片優化模式,每張圖片都會根據必定的比率壓縮大小。
此外,若是你掌握了 Grunt 或 Gulp 之類的前端客戶端工具,就能夠在建立應用或者部署應用時自動實現圖片優化。
延伸閱讀:Visual Studio 2015 圖片優化插件
每一個網站都有圖片。圖片幾乎是必不可少的網站元素。
可是,若是你有不少小圖片,該如何處理呢?假設有20張小圖片,那就是20次圖片檢索請求,每張圖片一次。
這時候,Sprites 就能派上用場啦。
Sprites 是由衆多小圖片集合而成的一張大圖。瀏覽器能夠直接請求這張大圖,你再經過 CSS 技術抓取其中的小圖片,並將其展現在網頁的不一樣位置上。
我知道,不少開發者並不熟悉 CSS。所以,建議你們找點資料好好學習一下。CSS 真的很是有用。
此外,還有許多在線 sprite 生成器,能夠協助這一過程。(Piskel, Sprite Cow, 或者谷歌搜索:「在線 Sprite 生成器」)
延伸閱讀:ASP.NET MVC:數據驅動 CSS Sprites
有些讀者可能不知道 ETags 爲什麼物。其實,ETags 是用於 Web 緩存驗證的工具,容許有條件的客戶端請求。
經過 ETags,瀏覽器能夠判斷某項資源是否被須要。若是不須要,瀏覽器就不會向 Web 服務器發送請求,從而最小化請求數量。
筆者甚至將 ETag ActionFilter 類列爲最喜歡的 ActionFilter 類,由於 ETags 的確能最小化網站向 Web 服務器發送的請求數量。
延伸閱讀:我最喜歡的五個 ASP.NET MVC ActionFilters
捆綁與最小化早已不是什麼新鮮的概念了。
捆綁是指將全部 JavaScript 與 CSS 代碼打包爲一個 JavaScript 或 CSS 文件的過程。這與 Sprite 技術類似,不過處理的是 JavaScript 與 CSS 文件。捆綁能夠減小針對單獨 JavaScript 與 CSS 文件的請求,從而減小成本。
JavaScript 與 CSS 文件充滿了空格,這些空格佔用了很多的空間。最小化就是移除 JavaScript 或 CSS 文件裏的大量空格的過程。
在 ASP.NET MVC 項目中, App_Start 文件夾下有一個 BundleConfig.cs 文件。你能夠在該文件中定義 JavaScript 與 CSS 文件的捆綁或最小化設置。
延伸閱讀:捆綁與最小化
你發覺咱們的套路了麼?
實現壓縮的方式有兩種:一是經過 IIS 激活壓縮,二是經過 ActionFilter 類。
壓縮啓用後,Web 服務器會將資源壓縮成包,再傳給客戶端。後者會先解壓縮,而後再展現內容。
這能有效提升資源傳送的速度。
筆者還爲此寫了一個 CompressFilter 類。經過 Action 方法調用該類,就能實現對網頁的壓縮。
延伸閱讀:我最喜歡的五個 ASP.NET MVC ActionFilters
在前文討論最小化時,筆者不由想到,你的 HTML 頁面確定也存在了許多空格。
HTML 文件越小,它傳送到瀏覽器的速度就越快。取決於 HTML 頁面大小的差別,移除其中的空格可以縮減 20%到50%的大小。
爲此,筆者寫了一個 Whitespace ActionFilter 類,也是筆者最喜歡的 ActionFilter 類之一。
延伸閱讀:我最喜歡的五個 ASP.NET MVC ActionFilters
AJAX 早已推出,並且好處多多。它模糊了桌面應用與 Web 應用間的界限。
它也絕對能夠加速網站中的一些任務。
例如,筆者在本身的網站中創建了一個儀表盤。
在具體實現時,我能夠先讓頁面加載一個儀表盤骨架。在頁面加載完畢以後,開始運行 JavaScript 方法,請求小部件的加載。在以後會出現小部件的地方,能夠先放置等待加載的圖標。當部件加載完畢以後,再以部件的內容替換等待加載的圖標。
這能使用戶的瀏覽體驗更加流暢。
延伸閱讀:爲何說 AJAX 如同胡椒粉
諸如 Entity Framework 及 NHibernate 之類的對象關係映射(Object-Relational Mapping, ORM)數據庫可以進行隱式調用(hidden calls),即使你從未要求過此類調用。
每一種 ORM 數據庫都有許多不爲人知的「陷阱」。可是,你能夠作到的是:確保在本身的代碼中,每次檢索數據都只發起一次數據庫調用。
當筆者剛開始使用 Entity Framework 數據庫時,曾吃過很多虧。好比,爲了檢索一條特定的記錄,我發起了一次數據庫調用。在檢索該記錄時,程序發現了該記錄的子對象,因而決定檢索這些子對象,爲此,針對每一個實體,又都發起了一次數據庫調用(有時候,爲了一條特定記錄,竟然會產生200次數據庫調用,真是可怕!)……
如今,筆者的經驗法則是:
若是你不太肯定如何獲取多個結果集,能夠閱讀有關使用 Entity Framework 檢索多個結果集的帖子。
延伸閱讀:ASP.NET MVC: 使用 Entity Framework 從泛型存儲庫中返回多個結果集
記得在前文中我說的儘可能使用 AJAX 麼?
基於一樣的理由,我決定放棄建立自定義的評論系統,轉而使用 Disqus。
爲何呢?理由有五個:
這類第三方服務不只能爲個人網站提供常見的基本功能,還藉助 AJAX 爲個人讀者實現了流暢的閱讀體驗。
延伸閱讀:Disqus
本文介紹的絕大部分速度提高方法都須要特定的編程技巧。一旦掌握了這些技巧,你就能輕易實現高效快速的網站。
以上全部技術都應用在筆者的網站中。
你不信?
右鍵單擊以查看本文源碼。
OneAPM 能助您輕鬆鎖定 .NET 應用性能瓶頸,經過強大的 Trace 記錄逐層分析,直至鎖定行級問題代碼。以用戶角度展現系統響應速度,以地域和瀏覽器維度統計用戶使用狀況。想閱讀更多技術文章,請訪問 OneAPM 官方博客。
本文轉自 OneAPM 官方博客
原文地址:https://dzone.com/articles/10-ways-to-speed-up-your-aspnet-mvc-application