.NET-记一次架构优化实战与方案-前端优化
前言
上一篇《.NET-記一次架構(gòu)優(yōu)化實戰(zhàn)與方案-梳理篇》整理了基本的業(yè)務(wù)知識,同時也羅列了存在的問題,本篇主要是針對任務(wù)列表的頁面進(jìn)行性能優(yōu)化。
該篇主要涉及的是代碼實現(xiàn)上的優(yōu)化,實現(xiàn)上的問題是戰(zhàn)術(shù)債務(wù),也就是我們平常出現(xiàn)的各種BUG,這種問題一出直接影響業(yè)務(wù)運營與系統(tǒng)運作。
你永遠(yuǎn)想象不到同一條SQL相差個3.5秒鐘,遍歷兩次就導(dǎo)致了 3.5秒*2次 = 7秒的耗時。具體請看下文。
二八原則
有接觸過性能問題的朋友應(yīng)該都了解過,一般性能瓶頸都是在某行代碼或者某個方法,而不是整一個代碼實現(xiàn)流程。
例如:遍歷計算、沒使用到索引的SQL語句、多余重復(fù)的接口請求等等。
以二八原則的思想來考慮,80%性能耗時由20%的代碼引起,因此我們處理原則就是具體定位,具體問題,針對解決。
現(xiàn)象描述
任務(wù)列表頁面問題主要體現(xiàn)于加載任務(wù)列表過慢的性能低效問題,就如上一篇所說的加載事件需要11秒!這種對于用戶來說是不能忍受的,特別是以現(xiàn)狀JOB觸發(fā)的方式時效如此低,用戶多看兩次,估計就會有放棄該產(chǎn)品的沖動。
因此我們需要遵守3秒鐘原則。
3秒鐘原則
現(xiàn)代人的生活節(jié)奏都很快,網(wǎng)頁間的切換速度也越來越快。所謂“3秒鐘原則”,就是要在極短的時間內(nèi)展示重要信息,給用戶留下深刻的第一印象。當(dāng)然,這里的3秒只是一個象征意義上的快速瀏覽表述,在實際瀏覽網(wǎng)頁的時候,并非真的嚴(yán)格遵守3秒。
因此,在設(shè)計互聯(lián)網(wǎng)產(chǎn)品的頁面時,用戶等待時間越少,用戶體驗越好
優(yōu)化實施
任務(wù)列表頁面為以信息展示的讀操作為主,因此對于 I/O 密集型程序,問題主要體現(xiàn)于兩點:
慢查詢語句
多次建立查詢
多次建立查詢
該問題主要從代碼實現(xiàn)方式上解決,場景又分為兩種情況:
信息重復(fù)查詢
描述:函數(shù) A 查詢了一次 Users 信息,其函數(shù) A 的子函數(shù) B 又進(jìn)行了一次查詢了一次Users 信息。
解決方案:去除子函數(shù) B 的重復(fù)查詢,并提供參數(shù)由函數(shù) A 傳入
遍歷查詢
描述:item.foreach(item=> _userIdRespository.Get(a=>userId == item.userId) )
解決方案:先批量查詢,然后在內(nèi)存過濾。
var userIds = item.Select(a=>a.UserId);
var users = _userIdRespository.ToList(a=>userIds .Contains(a.userId));
Item.foreach(item=>{
Var user = users .where(a=>a.userId == item.userId)
})
以上并不是什么特別牛逼的技術(shù),但是往往是某些地方性能瓶頸點,而導(dǎo)致這樣的原因也只有一點,貪方便。上遍歷查詢的例子看出,兩種寫法的代碼量的確差了幾行,但是在實際使用場景中性能會差幾倍,而且隨著業(yè)務(wù)的增長其差距越發(fā)的明顯。
慢查詢語句
對可能出現(xiàn)慢查詢的語句的進(jìn)行日志埋點記錄耗時(特別是手寫 SQL 與復(fù)雜視圖),定位后可與專業(yè)人士溝通優(yōu)化,我們有DBA,因此我只要把問題定位到就好了。
下面展示一個我在優(yōu)化時候遇到一個的情況:
優(yōu)化前是查詢一個復(fù)雜視圖,因為查詢沒用到索引,單次查詢了3.5秒,在生產(chǎn)環(huán)境還有遍歷2次的情況,一個7秒。
優(yōu)化后將視圖改成存儲過程,并通過業(yè)務(wù)了解到一個用戶只會查詢出一條記錄,重復(fù)查的情況,耗時直接降到120+毫秒
優(yōu)化經(jīng)歷
我剛完成這個需求二期上線,就收到加載慢的消息,整個優(yōu)化過程并非一步到位的,主要分了三步:
第一步,能立刻可預(yù)見的,比較低級的優(yōu)化了,并將列表加載改成異步,因為需求已經(jīng)上線了,要先唬住用戶。
第二步,把多次建立查詢和部分已經(jīng)在測試環(huán)境很慢的語句。優(yōu)化完了之后發(fā)到了生產(chǎn),快了2秒多,但是仍然不理想
第三步,給所有有可能查詢慢的地方都寫上日志,后來定位到了好幾個慢查詢,其中上面是罪魁禍?zhǔn)住?/p>
發(fā)布上線后,從原來的11秒耗時,降到1秒到2秒,細(xì)心的朋友會看見,在加載列表有一段UpdateUserTaskStatus的代碼,這個是在讀頁面做更新操作,具體原因與分析放到下一篇進(jìn)行講解
結(jié)尾
? ? 本篇主要講解了我在優(yōu)化頁面加載性能過程中一些經(jīng)歷,當(dāng)然想優(yōu)化到極致還有更多做法,例如徹底的前后端分離,讀緩存等等。
然而我們需要在投入與產(chǎn)出比之間做出權(quán)衡,以有限的成本,使用樸實的技術(shù),達(dá)到有效的目標(biāo)效果。
原文地址:?https://www.cnblogs.com/skychen1218/p/10320994.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的.NET-记一次架构优化实战与方案-前端优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【.NET Core项目实战-统一认证平
- 下一篇: Blazor——Asp.net core