【新特性速遞】表格載入速度足足 3 倍提升,愛了愛了
FineUI 的下個版本(v8.0.0),我們會為表格新增延遲載入功能(EnableDelayRender),從而使得典型表格頁面載入性能提升 3 倍以上!
大數據表格
FineUI很早之前就已經支援大數據表格了,對於需要一次性展示超過 1000 條數據的純展示場景非常有用。
官網示例:FineUIPro 在線示例 – 基於 jQuery 的專業 ASP.NET 控制項庫
但是大數據表格屬於企業版功能,必須使用網址數據源,而且不支援樹表格、列鎖定、單元格合併等等很多特性,局限性比較大。
大數據表格的實現原理其實是虛擬滾動條,只展示當前用戶可視區域內的表格數據。
如下圖所示,長長的滾動條是由一個 .f-grid-table-bigdata-shadow 元素的高度撐起來的,而這個高度是根據每行的高度和總行數計算來的(所以大數據表格要求行的高度必須固定)。
v8.0新增的延遲載入
由於大數據表格存在一定的局限性,我們一直在思考有沒有更簡單的辦法提到普通表格的載入性能,特別是每頁 200 – 1000 條數據的表格性能,這個才是我們最經常遇到的應用場景。
說到底,表格行數對渲染性能的影響歸根結底是因為大量DOM節點的產生,而在 200 條以上的數據情況下, 用戶在頁面第一次載入時最多看到不超過 30 條數據。
也就是說,我們要額外載入 170 條用戶看不到的數據,而這些額外載入的數據會影響頁面的打開速度。
如果能夠延遲載入那些用戶看不到的數據,豈不是一舉兩得:
- 不會影響頁面第一次載入時的用戶看到的數據
- 加快頁面第一次打開的速度
FineUI v8.0新增的延遲載入特性就是為了實現這個目的,來看下頁面第一次載入時的DOM節點渲染情況:
和大數據表格的情況類似,但是實現方式完全不同。
整個表格在頁面第一次載入時就完全渲染了,只不過DOM節點只渲染了前面的 30 多行數據,剩餘的 400 多行數據以佔位符的形式渲染到DOM,這就節省了大量的DOM渲染時間(載入了頁面第一次渲染速度,提升用戶體驗)。
為了比較準確的描述表格的渲染速度,我們寫了如下的測試程式碼,用于衡量當前表格渲染用時:
<f:Grid ID="Grid1" ...> <Columns> ... </Columns> <Listeners> <f:Listener Event="render" Handler="onGridRender" /> </Listeners> </f:Grid> <script> // 等所有JS資源下載完畢後開始 var __STARTTIME = new Date(); // 表格渲染完畢後結束 function onGridRender() { F.ui.Grid1.setTitle(F.ui.Grid1.getTitle() + ' - 渲染時間:' + ((new Date() - __STARTTIME) / 1000).toFixed(2)); } </script>
首先來看下,目前表格在載入 500 條數據和 1000 條數據的性能表現:
添加了 v8.0.0 新增的延遲載入特性(EnableDelayRender=true)之後,我們再來看下相同頁面的載入速度:
小結
經過多次測試,我們測算出平均渲染速度,如下表所示。
可以看出,FineUI v8.0新增的延遲載入屬性(EnableDelayRender=true)可以極大的提升表格頁面的載入速度,在典型的每頁 500 條數據的情況下,頁面第一次載入的速度提升 3 倍以上。
第一次 | 第二次 | 第三次 | 第四次 | 第五次 | 第六次 | 平均載入時間(秒) | 渲染速度提升 | |
500條數據 | 0.91 | 0.87 | 0.84 | 1.01 | 0.92 | 0.88 | 0.91 | – |
1000條數據 | 1.72 | 1.68 | 1.65 | 1.64 | 1.70 | 1.62 | 1.67 | – |
500條數據(延遲渲染) | 0.25 | 0.22 | 0.24 | 0.24 | 0.22 | 0.20 | 0.23 | 396% |
100條數據(延遲渲染) | 0.40 | 0.38 | 0.35 | 0.34 | 0.41 | 0.39 | 0.38 | 439% |
為了更直觀的感受兩者的差異,我們通過兩個動圖來呈現 FineUI v8.0 帶來的表格渲染速度的提升。
未啟用延遲載入
啟用延遲載入
歡迎入伙://fineui.com/fans/
三石出品,必屬精品