今年上半年公司的產品開發側重點從開發新產品轉向了性能優化和運營,因此需要我們針對性能優化這一塊,制定一些計划。二月份已經進行了一些初步的實踐,這里做一個小結,便於今后參考。
一、前端優化
1.頁面初始資源的加載
通過YSLOW+PageSpeed來進行前端性能檢測,根據其給出的意見做出對應的調整。由於產品中前端頁面都比較簡單,目前這部分內容的評分基本符合要求。
2.JS腳本執行效率
考慮到我們的產品大多為客戶端內嵌網頁,很多數據是從客戶端異步獲取的,JS腳本也會受到這些數據請求時間的影響,且內嵌客戶端網頁不能通過Firebug之類的工具進行斷點調試,目前的思路主要是自己寫小工具,在JS代碼中埋點,最后輸出每個功能的執行時間,以此來定位性能問題觸發點。
二、后端優化
1.數據庫優化
主要體現在數據庫的查詢操作上面,部分查詢很慢。
發現:SQL測試
解決:優化SQL語句或者采用高效的數據庫操作工具或者進行讀寫分離
2.程序流程上的優化
隨着需求的增加和調整,存在代碼累積的問題,有時候會導致一個簡單的業務中出現重復的流程。
發現:CodeReview
解決:代碼重構
3.程序架構上的優化
一方面是隨着項目的發展,用戶量的增加,初期的程序設計不能滿足現有的需求;另一方面是為了解決問題,在項目中使用了其他的框架技術,導致后期比較雜亂,難以部署維護。
發現:項目總結
解決:更改程序設計方案,精簡外界依賴。
4.算法上的優化
主要針對計算比重較大的項目,目前很少涉及。
發現:CodeReview
解決:代碼重構
5.代碼規范上的優化
循環嵌套過深、流程語句過長也會導致性能下降。
發現:PHPMD的郵件通知、CodeReview
解決:代碼重構
優化中遇到的幾個問題
1.定位:如何找到瓶頸點?
1)通過工具測試性能
比如YSLOW、JMeter、自己編寫的小工具等
2)通過反饋獲取數據
日志分析、用戶留言等
3)代碼評審
2.如何保證優化過程中不影響新功能的開發,並且優化后可以快速上線?
1)將需要優化的內容分解,每次優化一個功能,並做好單元測試
2)利用SVN的分支功能,在branch分支上進行優化工作,在trunk主干上進行線上項目的維護
3)正式服務器上用虛擬機額外部署一份程序,便於出現線上問題時,能夠快速重現解決
3.如何避免下一次出現相同的問題?
1)自動化檢測工具
2)構建並維護性能規范庫,類似雅虎的23條規范
4.如何測試客戶端內嵌網頁的前端性能?
偽造數據做一個頁面,由於只測試前端性能,所以這樣通過YSLOW測得的數據仍有參考價值。
5.外部接口如何測試?
單元測試
6.對於一些難以快速優化的情況,如何改善?
通過交互上的優化來彌補性能上的不足。比如請求數據耗時很長,那么可以通過一個遮罩層加Loading圖標的方式,來改善用戶體驗。
經過初期的數據搜集和測試,從目前的問題來看,影響性能最大的因素,在於服務端的數據庫操作和客戶端的JS腳本。后續會針對這兩塊做進一步的學習。