【文章內容使用 Gemini 1.5 Pro 自動產生】
Flutter 在 2020 年上半年的效能更新
作者:Yuqian Li 和 Shams Zakhour
速度是 Flutter 的關鍵支柱。本文重點介紹 Flutter 社群成員在 2020 年上半年實施的效能改進。
如果您在 2020 年 6 月之後幫助過效能改進,我們將在未來的文章中涵蓋這些內容。我們希望與您分享這些內容,希望 Flutter 社群受到鼓舞,一起參與改進 Flutter 效能的努力!
量化改善
[應用程式大小] Flutter Gallery 應用程式大小減少 18.5%
貢獻者: alexmarkov,sstrickl,mkustermann,askeksa-google,rmacnak-google,mraleph,crelier
- 提交 f56b0f,a2bb73,d77f49,e2faac,8e7ffa,76c628,4ab9c7,1c2d37,27e64c,6a7e4e,054929
- Android 的 Flutter Gallery 範例減少了 18.5% (從 9.6MB 到 8.1MB)
[應用程式大小] 透過字體子集處理,Gallery 應用程式縮減了 100KB 的大小
貢獻者: dnfield,jonahwilliams,zanderso,jmagman,blasten
- PR 14828,49737,49842,50224,51808
- Flutter Gallery 應用程式縮减了 100KB 的大小 (大小縮減)
- 修復了「搖樹 Material 圖示 16311」,「將 hb-subset 作為引擎組建的一部分進行組建並上傳到雲端儲存 43642」,「在 flutter_tools 中使用 font-subset 並搖樹圖示字體 43644」,「為所有平台連接字體子集處理 49730“)。
[速度、記憶體] dart2js 工具的運行速度提升了 9 倍,記憶體減少了 99% 以上
貢獻者: rmacnak-google,a-siva
- 提交 5b8c4e
- dart2js 自我編譯速度加快了 9 倍 (從 46 秒到 5 秒),記憶體減少了 99% 以上 (從 537MB 到 1.5MB),堆大小 1.5GB,堆快照 400MB
[速度] 從 OpenGL 切換到 Metal,iOS 平均渲染速度提升了 50%
貢獻者: chinmaygarde,dnfield,jason-simmons,cbracken,amirh,liyuqian
- PR 8936,9383,11070,13056,13367,17080,17162,17154,17431
- flutter_gallery_ios__transition_perf 的平均畫面渲染時間
average_frame_rasterizer_time_millis
提升了 50% (從 6ms 到 4ms) - 修復了「Flutter 應該在 iOS 上使用 Metal 而不是 OpenGL 18208」
[速度] 由於著色器編譯,最差畫面渲染時間提升了 2 到 5 倍
貢獻者: liyuqian,jonahwilliams,chinmaygarde,iskakaushik,zanderso,sfshaza2,filiph,acoutts
- PR 17300,53859,17601,17861,58743,56638,4430,12142
- Android 的
flutter_gallery__transition_perf
最差畫面渲染時間worst_frame_rasterizer_time_millis
提升了 2.25 倍 (從 90ms 到 40ms) - iOS 的
flutter_gallery_ios32__transition_perf
最差畫面渲染時間worst_frame_rasterizer_time_millis
提升了 5 倍 (從 300ms 到 60ms) - 一些實際應用程式的速度提升了 3.75 倍 (從 229ms 到 61ms)
- 修復了「基於 SkSL 的著色器預熱 53607」、「三次貝茲曲線回歸 35142」和「儲存」一些客戶。
[速度] 滑鼠點擊測試速度提升了 15.8 倍
貢獻者: dkwingsmt,yjbanov,goderbauer,gspencergoog
- PR 59803 59883
bench_mouse_region_grid_scroll
的畫面持續時間 (網頁) 提升了 15.8 倍 (從 79ms 到 5ms)。- 修復了「訂閱 MouseRegion 事件時效能低下 41194」
[速度] 平台訊息回應處理速度提升了 13.9 倍
貢獻者: zljj0818,jason-simmons,liyuqian
- PR 18838,18945,兩者都受 18808 啟發
- 修復了「載入大型圖片時,Image.asset 會阻塞 UI 線程 58572」
PlatformMessageResponseDartComplete
速度提升了 13.9 倍 (從 9164us 到 660us)
[速度] 使用不透明路由時,畫面構建時間提升了 20% 到 37%
貢獻者: goderbauer,dnfield
- PR 48900
flutter_gallery_ios32__transition_perf
的平均畫面構建時間average_frame_build_time_millis
提升了 20% (從 7.38ms 到 6.13ms)flutter_gallery_ios32__transition_perf
的第 99 個百分位數畫面構建時間99th_percentile_frame_build_time_millis
提升了 37% (從 50.45ms 到 36.63ms)- 修復了「在推入覆蓋/導航器不透明內容時,優化不必要的重建 45797」
[速度] 使用 ImageFiltered 而不是 BackdropFilter,模糊效果速度提升了 4.8 倍
貢獻者: flar,hixie,yjbanov,liyuqian
- PR 14491,47489,58277
- Moto G4 上的演示應用程式速度提升了 4.8 倍 (從 29ms/畫面到 6ms/畫面)
- 修復了「ImageFilter Widget 13489」
[速度] 使用 Flutter 網頁捲軸大型靜態內容時,速度提升了 14 倍
- PR 17621
text_canvas_cached_layout.html.layout.average
速度提升了 14.01 倍 (從 463.74ms 到 33.10ms)- 修復了「使用 Flutter Web 捲軸大型靜態內容時卡頓 42987」和「在 Web 上繪製畫布邊界外的文字很昂貴 48516」
[速度] Flutter 引擎 Shell 初始化速度提升了 6.8 倍
貢獻者: scutlight,jason-simmons,gaaclarke,liyuqian
- PR 18225
BM_ShellInitialization
速度提升了 6.8 倍 (從 18.3ms 到 2.7ms)
[速度] 限制條件相同時,跳過調用構建器,速度提升了 5 倍
- PR 55414
- 使用 Flokk 客戶端應用程式捲軸聯絡人列表時,速度提升了 5 倍(從大約 10FPS 到大約 50FPS)。
- 修復了「LayoutBuilder 應該快取限制條件,如果沒有改變就不應該重新建立 6469」
[速度] 網頁上的陰影和動畫速度提升了 2 倍
- PR 17864,17866,17867
- 樣本網頁應用程式 的速度提升了 2 倍 (從 30fps 到 60fps 到 從 30fps 到 60fps)。
- 修復了「Web:使用陰影 + 動畫時效能低下 54507」
[速度] Web Flutter Gallery 啟動速度提升了 3 倍
貢獻者: ferhatb,clocksmith,rami-a
- PR 109,183
- Web Flutter Gallery 啟動速度提升了 3 倍 (從 6077ms 到 2039ms)
[速度] 在 Fuchsia 中啟用柵格快取後,平均畫面渲染時間提升了 2.8 倍
貢獻者: dreveman,liyuqian,chinmaygarde,arbreng
- PR 17753
frame_rasterizer_times_avg
速度提升了 2.8 倍(從大約 10ms 到大約 3.5ms)- 修復了「由於柵格快取被停用,Fuchsia 上的效能低下 54950」
[速度] 透過排除無效的動畫圖片,第 90 個百分位數畫面構建時間提升了 1.85 倍
貢獻者: dnfield,liyuqian,tvolkert,digiter
- PR 50851,50842
animated_placeholder_perf
的第 90 個百分位數畫面構建時間提升了 1.85 倍 (從 3.148ms 到 1.699ms)- 修復了「當長列表中的卡片內部使用列表構建器時,flutter 的畫面速率很低 (平均 20 到 35fps) 35592」
[速度] Google 智能顯示器 P10 的 FPS 提升了 2 倍
貢獻者: chinmaygarde,dnicoara,cbracken,jason-simmons,asakhart,rdaum
[速度] 透過增強子元素快取,ImageFilterLayer 的速度提升了 2.45 倍
- PR 17175,54903,58277
- ImageFiltered Transform 的平均畫面渲染時間
average_frame_rasterizer_time_millis
提升了 2.45 倍 (從 18.41ms 到 7.53ms) - 還修復了「由於 OpacityLayer 柵格快取未命中,轉場效能略有下降 52864」
[速度] 大型 dart2js 編譯速度提升了 15%
貢獻者: rmacnak-google,a-siva
- 提交 d67fbe
- 大型 dart2js 編譯速度提升了 1.15 倍 (從 545 秒到 472 秒),大型 dart2js 編譯的最大堆容量減少了 9% (從 13.057GB 到 11.861GB)。
- 修復了「成長策略被併發掃描誤導 21364」
[速度] 大型應用程式的 AOT 編譯時間提升了 1.8 倍
貢獻者: alexmarkov,mraleph,sigurdm,cskau-g
- 提交 467c98
- 大型應用程式 (從 dill 檔案) 的 AOT 編譯時間提升了 1.8 倍 (從 274 秒到 152 秒)
[速度] Dart RegExp 在 AOT 模式下的匹配速度提升了 5 到 13 倍
貢獻者: mraleph,rmacnak-google
- 提交 2c922b
- 來自問題 42366 的基準測試速度提升了 5 倍。
- RegExp(RunTime) 基準測試在 Linux 工作站上的速度提升了 13 倍 (從 17863744.009us 到 1301678.797us)
- 修復了「RegExp 在 AOT 模式下非常慢 42366」
[速度] Dart UTF8 解碼速度提升了 5 倍
貢獻者: askeksa-google,mkustermann,rakudrama
- 提交 cf6f89,e35ca3,78df4a,fa2fd4
- X64JIT TwoByteString 基準測試速度提升了 5.02 倍。
- 修復了「快速路徑 Uint8List 到 _OneByteString 轉換 41703」、「直接將 UTF-8 結果寫入字串 41704」
[速度] async/sync* 函數的速度提升了 35% 到 65%
貢獻者: cskau-g,mkustermann,mraleph
- 提交 e29407,fdca1f,7ed169,ca94ad
- 在 {dart,dart-aot}-{ia32,x64,armv7hf,armv8} 上,
Calls.IterableManualIterablePolymorphicManyYields
的速度提升了 35% 到 65%。 - 修復了「改進 VM 上 sync* 程式碼的效能 37753」、「在 VM 中生成 sync-yield 函數時,評估使用 IndirectGoto 37754」
[速度] 使用未裝箱的參數和欄位,時間最多減少了 31.82%
貢獻者: mkustermann,mkustermann
- 提交 9eb531,b95149,e076e7,9eb531
matrix_utils_transform_rect_affine
迭代時間最多減少了 31.82%。- 修復了「Dart VM 中的真實未裝箱欄位 40004」
[速度] Dart Pointer<Int8,Int64,etc> 在 AOT 中的載入/儲存速度提升了 20% 到 25%
貢獻者: dcharkes,mkustermann
- 提交 408123
- 在 x64 上,AOT 中的
Pointer<Int8,Int64,etc>
載入/儲存速度提升了 20% 到 25%。 - 幫助「儲存和載入應該支援未裝箱的索引 (在 AOT 中) 39432」
其他改進
[應用程式大小、能源、記憶體、速度] 將 A/B 測試模式加入到本機 Devicelab 執行器
貢獻者: yjbanov,flar,ferhatb,christopherfujino,liyuqian
[應用程式大小] 修復了「常見問題解答中 iOS 應用程式大小不正確」
貢獻者: [jmagman](https://github.com/