端性能優化是指通過一系列的技術手段和優化策略,提高網頁的加載速率和用戶體驗。下邊是一些后端性能優化的方案:1.頁面渲染優化:-降低HTTP懇求:合并和壓縮CSS和JavaScript文件,使用CSSSprites技術來降低圖片懇求。-延后加載:將非關鍵資源(如圖片、視頻等)的加載延后到頁面其他內容加載完成后再進行加載。-使用CDN加速:將靜態資源布署到全球分布的CDN節點上,推進資源的加載速率。-使用懶加載:只加載當前可見區域的內容,延后加載其他區域的內容。2.打包優化:-代碼分割:將代碼根據功能模塊進行分拆,按需加載,降低首次加載的文件大小。-TreeShaking:通過靜態剖析,除去未使用的代碼,降低打包后的文件大小。-按需加載:依照路由或用戶操作,動態加載所需的模塊和組件,降低初始加載的資源。3.總體優化:-緩存優化:合理設置緩存策略,借助瀏覽器緩存、CDN緩存、本地緩存等,減輕重復懇求和數據傳輸。-壓縮資源:對CSS、JavaScript、HTML等靜態資源進行壓縮,降低文件大小,提升加載速率。-降低重畫和回流:通過優化CSS款式和DOM操作,降低頁面的重畫和回流,提升渲染性能。-使用WebWorkers:將一些歷時的任務放在WebWorkers中執行,防止阻塞主線程。
升商城系統的頁面加載速度與進行SEO優化是提高轉化率的關鍵策略。以下是一些具體的操作建議:
綜合運用以上策略,不僅可以提升用戶在商城的瀏覽體驗,縮短頁面加載時間,還能通過SEO優化增加搜索引擎可見度,吸引更多潛在客戶,最終提升轉化率。
灝 大淘寶技術 2024年07月15日 18:04 浙江
最近做了一些移動端頁面的首幀優化的工作,有很多心得和感受,其中有很多共性的東西,總結成一篇文章希望可以幫助到更多業務,也希望引起讀者一起討論。
為何要做首幀優化
作為程序匠人,一直在努力追求做一款好的產品,打磨各個細節,做好用戶體驗,而首幀是用戶接觸到產品的第一個頁面,是體驗的重中之重。也正因是產品的第一個頁面,轉化率接近100%,從ROI的角度來說,做好首幀優化也是一個很劃算的deal。
做好首幀優化,至少可以帶來以下好處:
首幀口徑和衡量標準
做優化前我們需要先想想,用戶對首幀體驗預期是怎樣的?首幀定義是什么,起始范圍是什么。不同的口徑會影響我們的指標,設計方案,工作量。定義了口徑之后,我們可以確定優化事項范圍以及邊界。
Loading圖:
即開始出現loading、展現灰底圖或是頁面框架圖,如果這頁面展示也比較久的話,則說明用戶交互出現卡頓、假死,遲遲沒收到反饋,用戶交互被阻塞,屬于嚴重影響用戶體驗的行為。所以建議在展示骨架圖之前,除了framework以外,不要有io、網絡等耗時的前置依賴,也不需要有中轉頁的行為邏輯。
內容主體呈現:
即頁面大部分的內容已經渲染出來,用戶可以得到足夠的信息,這是一個比較符合用戶體感的口徑,大多數業務選取的就是這個口徑。不過不同業務對于“大部分”,“主體”的定義有所不同,業務可以結合自身需求進行合理選擇:
頁面可交互:
這個階段表示頁面已經完全渲染完成,并且用戶可以進一步交互,如點贊、分享、收藏、加購等行為。
絕對耗時:
指定口徑下的絕對耗時時長,單位一般是ms,多是用于單機線下的驗證和比較,不同機型之間、不同場景下的差異較大,如高端機與低端機之間的差別可以相差好幾倍,如要反應樣本的整體性,多用分位值或者秒開率來衡量。
分位值/秒開率:
取值標準:
如何分析排查性能問題(以Android為例)
首先要掌握自身產品以及行業競品的首幀數據,了解在行業中的一個排名情況,再決策是否要進一步做優化,做到什么樣的程度。為了保證自身和競品采用的同一種口徑獲取首幀耗時,我們這邊采用了錄屏的方式。
錄屏分析方案:在同一臺手機上使用特定幀率錄屏(如30fps,即1幀33ms),再通過數幀數的方式來計算出首幀耗時的時間,錄屏的越高越精確。
自動化腳本方案:
通過自動化錄屏腳本工具、使用模擬點擊 + OCR文字識別/圖像識別的方案,識別首/尾幀、進而自動化生成耗時的中位數、平均值。
在分析問題之前,我們要搞清楚系統是如何將首幀繪制在屏幕上的,了解了這些我們才能針對性的分析問題。
從代碼、資源等細粒度的維度(如方法級別、事件級別),來定量分析程序對CPU、內存、網絡IO等核心計算資源的消耗情況,可以比較完整、全面的分析啟動過程,但這種方式得到的數據比較細碎、散點,需要經過一定的歸納、合并才能得到一個具體可實施的方案。
如果我們的頁面是通過第二/三方的頁面框架所構建,如weex/rn/flutter等框架。我們可以通過第二方框架提供的性能分析工具、插件去分析和歸因。
有時為了彌補官方工具火焰圖太細碎、難以聚類、需要花費更多時間去分析和追蹤,我們可以根據業務視角、使用自定義的業務階段/流程,去粗粒度的去分析各個階段的耗時。
常見的優化方案和策略
分析完原因后,我們需要對不同原因給出優化方案,首幀優化的核心思想用一句話總結是:在盡可能在短的時間里準備好首幀渲染所需要最小的資源模型。圍繞“最短時間”和“最小的模型”兩個中心思想下,總結了一些常見的優化策略:
在前置頁面的合理時機(一般是閑時)提前獲取數據、下載資源,并解析,然后緩存到內存或者磁盤里,以便后置頁面快速讀取數據和資源。
這個策略可能帶來以下副作用:
與首幀無關的代碼邏輯、資源可以在首幀渲染后進行初始化,具體的初始化時機可以在使用時再初始化,如某些二級頁面的創建、多余tab的創建等。
并行處理:充分利用多核CPU,通過多線程并行處理耗時的任務,提升CPU的負荷。如容器初始化和數據請求解析可以同時進行。
異步化:一些比較耗時、IO任務,不要占用寶貴的主線程資源。
Android里面ViewTree構建和渲染是比較耗時過程的,如下:
優化方案:
為了加快數據獲取,我們可以從前一個頁面借用一部分數據過來將主體內容做填充,隨后再用真實數據刷新。這個方案多適用于列表進入詳情的場景。
這里的數據不僅包含文字和圖片,也可以延伸到媒體播放器、camera取景器等其他一些文件流、數據流,甚至可以是widget組件(共享元素動畫)。
如果頁面元素比較多,數據量比較大,一次性請求加載的時間比較長,這個時候我們可以通過分塊的方式,將大頁面拆成若干個小頁面模塊、將服務端接口拆成若干個小接口,各個頁面模塊獨立渲染。可以有效降低服務端RT耗時,以及頁面渲染耗時。
使用骨架圖作為打底圖和純白底圖相比,有了布局樣式等信息,更加接近于首幀的效果,正式數據刷新時,頁面也不會出現明顯刷新,體驗比較好。
線上驗收
線下的優化,并不意味著線上真實用戶也能同步看到優化的結果,因為業務路徑的差異、機型的差異,你線下的優化可能不具備普遍性,所以需要線上真實結果的反饋。
包含:版本、設備分、業務場景、機型、時間等盡可能多的數據維度的數據大盤,可以盡量還原優化or劣化的信息全貌,提供更多的歸因信息。
長尾數據、小眾case往往容易被整體數據給覆蓋,不足以引起重視,為了我們應該分別分析中位數、分位數。
這樣做不僅能控制變量確保優化項的嚴格有效,還能借此來觀察性能優化所帶來的業務指標收益,這些都可以作為規劃后續啟動優化方向的參考指導。
防劣化
人無完人,人都會失誤犯錯,絕對不能把系統性能交給某一個人身上,一個人犯錯概率高,一群人都犯錯的概率低,應該交給一群人共同協作的機制和流程。
防劣化相比于優化是更能持久有益的,所以更應該在較早期建立起防劣化機制:
結語
首幀優化并非一蹴而就,而是一個需要持續迭代與打磨的過程,在初期階段優化空間相對較大,只需要投入一些不多的資源,即可看到較大的收益,但隨著優化不斷深入,到了中期階段,就需要有相當程度的投入,去攻堅各個難點,聚少成多,才能看到收益。后期隨著業務越來越復雜,分支越來越多,要做防劣化工作,同時也要和業務一起做好精細化管理,將有限的資源,分配給最優先級的業務,要做好ab實驗管控、優先級管理、及時下線等。
為了將達到最優的啟動速度,我們運用了各式各樣的策略,將時間和空間塞得滿滿的,但是這改變了原來的常規流程,帶來了額外代碼復雜度提升,比如預加載策略,后面維護同學需要考慮,預加載失敗以及成功兩種情況,又或者是緩存策略,后面維護的同學需要考慮緩存命中、不命中的情況,如果不斷使用if堆積代碼,那代碼最終將無法維護。所以我們需要通過框架來管理復雜度,盡量讓業務層無感知。比如數據中間層,業務無需關心數據是否來自緩存還是實時請求,拿來使用即可。
通常我們以啟動速度來衡量啟動性能。為了提升啟動速度,我們可能會把一些原本在啟動階段執行的任務進行延后或者按需,這種方式能夠有效優化啟動速度,但同時也可能損害后續的使用體驗。比如,如果將某個啟動階段的后臺任務延后到后續使用時,如果首次使用是在主線程,則可能會造成使用卡頓。因此,我們在關注啟動性能的同時,也需要關注其他可能影響的指標。性能上我們需要有一個能體現全局性能的宏觀指標,以防止局部最優效應。
參考資料
團隊介紹
我們是淘天集團-內容技術團隊,專注于推動淘寶內容生態和電商體驗的深度融合。我們致力于為全球用戶提供豐富、多樣性、高品質的購物內容體驗,旨在通過技術創新,更好地連接用戶和商品,以提升用戶的購物滿意度和平臺的商業價值。通過尖端技術提升內容創作、分發與消費的效率,賦能內容創作者、商家與消費者,構建一個繁榮、健康、可持續發展的內容生態圈。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。