Update Kinerja Flutter pada tahun 2019
Oleh Yuqian Li dan Shams Zakhour
Kecepatan adalah pilar utama bagi Flutter. Artikel ini menyoroti peningkatan kinerja dari paruh kedua 2019 yang diterapkan oleh teman-teman dari komunitas Flutter. (Ya, memang terlambat, tetapi lebih baik terlambat daripada tidak sama sekali!)
Jika Anda telah membantu kinerja Flutter pada tahun 2020, kami akan membahasnya di postingan mendatang. Kami berharap bahwa dengan membagikan ini kepada Anda, komunitas Flutter, bisa menginspirasi Anda untuk membantu upaya kami!
Kuartal 4 (Okt-Des) 2019
Peningkatan yang terukur
70% pengurangan memori dalam scrolling cepat gambar besar
kontributor: liyuqian, dnfield, chinmaygarde
- PR 14265: Pembersihan IO thread GrContext
- PR 46184: Pengujian memori saat scrolling gambar besar dengan cepat
- Dasbor: Pengurangan 70% (400MB menjadi 120MB) dalam fast_scroll_large_images__memory diff-median
- Masalah 19558: Memori IO thread GrContext perlu dibersihkan
Pengurangan 40% dalam penggunaan CPU/GPU untuk animasi iOS sederhana
kontributor: flar, liyuqian, hixie, chinmaygarde
- PR 14104: Pengerjaan ulang conditional offscreen yang lebih sederhana untuk dukungan pembacaan layar
- PR 13976: Secara dinamis menentukan apakah akan menggunakan permukaan offscreen berdasarkan kebutuhan
- PR 31865: Animasi sederhana menggunakan CPU/GPU/Daya tinggi (~20%) di iPhone 6
- 40% (23%-CPU-14%-GPU menjadi 13%-CPU-8.5%-GPU) pengurangan dalam simple_animation_perf_iphonexs cpu_percentage, gpu_percentage
Percepatan 41% untuk kinerja caret
kontributor: garyqian, liyuqian, justinmc
- PR 46720: Teruskan _caretPrototype untuk mencegah salah cache
- PR 46720: Percepatan 41% (6,709 milidetik menjadi 4,756 milidetik) untuk waktu build bingkai persentil ke-90
- Memperbaiki Masalah 24522: Kinerja caret buruk, waktu GPU tinggi per bingkai
Percepatan 10% untuk scrolling daftar dengan memperbaiki throttling cache raster
kontributor: liyuqian, chinmaygarde, flar, cyanglaz, zsunkun
- PR 31865: Animasi sederhana menggunakan CPU/GPU/Daya tinggi (~20%) di iPhone 6
- PR 13710: Memperbaiki throttling cache raster gambar
- PR 45050: Menambahkan pengujian perf untuk cache raster gambar
- Memperbaiki masalah pemblokir, 43083: Scrolling daftar tidak lancar dengan PR 13710: Memperbaiki throttling cache raster gambar
Percepatan 37x dalam waktu muat benchmark yang di-cache (Dasbor)
kontributor: caseyhillers, tvolkert, digiter, jonahwilliams
- PR 494: Cache get-benchmarks
- PR 484: /api/public/get-status memberikan respons yang di-cache
- Percepatan 37x (37 detik menjadi 1 detik) dalam waktu muat benchmark
Percepatan 2,3x untuk pembangunan APK
kontributor: jonahwilliams, blasten, zanderso, xster
- PR 44534: Meningkatkan kinerja build APK (~50%) dengan menjalankan gen_snapshot secara serentak
- Percepatan 2,3x (140 detik menjadi 60 detik) dalam build rilis APK untuk platform target android-arm, android-arm64, dan android-x64
+103 metrik kinerja yang direkam per tindakan engine Flutter
kontributor: liyuqian, digiter, keyonghan, godofredoc, cbracken
- PR 14556: Menjalankan dan mengumpulkan benchmark
- Masalah terkait: PR 37434: Memusatkan metrik kinerja, memberikan peringatan universal, dan meningkatkan dasbor kinerja
Pengurangan ukuran aplikasi 20%
kontributor: mraleph, alexmarkov, rmacnak-google, mkustermann, sstrickl, aartbik
- 3% dari Menaikkan offset PC dari StackMaps
- 2,58% dari Lebih lanjut memampatkan informasi sebelumnya di StackMaps
- 1% dari Standardisasi payload CompressedStackMaps bila memungkinkan
- 2% dari Sepenuhnya mengaktifkan deduplikasi instruksi dalam mode bare
- 0,3% dari Tidak membuat prolog monomorphic untuk fungsi yang membutuhkan deskriptor args
- 1% dari Membuang redundansi yang menginisialisasi penyimpanan null
- 6% dari Mengurangi penyelarasan Instruksi dan menghapus beberapa instruksi perangkap debugging
- 1,2% dari Menyesuaikan CSP selama potongan permintaan alih-alih setiap prolog fungsi
- 1% dari ARM64: Memblokir R22 untuk menahan NullObject()
- 2,5% dari Propagasi konstan seluruh-program
- 0,77% dari Menghapus kode yang tidak berguna
Percepatan 108x dalam kinerja Dart FFI
kontributor: dcharkes, mkustermann, sjindel, alexmarkov
- Gerrit 120661: Mengoptimalkan operasi Pointer untuk tipe yang dikenal secara statis
- Gerrit 119645: Pointer mengoptimalkan pemuatan dan penyimpanan yang diindeks
- Gerrit 121580: Mengizinkan sisipan fungsi yang dioptimalkan secara paksa di AoT
10–15% peningkatan kinerja dalam kode padat
kontributor: aartbik, mkustermann, mraleph
- Gerrit 117200: Analisis loop dan peningkatan BCE
- Peningkatan kinerja 10–15% di golem armv7, dan TypedData Bench: Gerrit 117200: Analisis loop dan peningkatan BCE
Percepatan 2,2x dalam pengujian flutter dengan serializer inkremental baru
kontributor: jensjoha, alexmarkov
- Gerrit 121121: Mengaktifkan serializer inkremental secara default
- Percepatan 2,2x (3:38 menjadi 1:39) di `pengujian flutter`
Serialisasi biner Kernel yang lebih cepat 10% dengan memberikan petunjuk sisipan untuk Dart VM JIT
kontributor: jensjoha, johnniwinther
Peningkatan kinerja 30% pada kode yang banyak async
kontributor: cskau-g, mkustermann, mraleph
Perbaikan lainnya
Memperbaiki kebocoran memori saat menggunakan PlatformView di iOS
- Memperbaiki kebocoran memori saat menggunakan PlatformView [IOS]
- Kebocoran memori saat menggunakan PlatformView [IOS]
Memperbaiki kebocoran memori saat animasi diputar di iOS
- Gerrit 260538: Jangan berikan pesan yang tidak valid untuk generator yang membuat tekstur tidak bisa di-cache
- Kebocoran Memori saat animasi diputar di iOS
Memperbaiki lebih banyak kebocoran memori iOS
- https://github.com/flutter/engine/pull/14275
- https://github.com/flutter/engine/pull/14326
- https://github.com/flutter/flutter/issues/35243
Memulai pembenahan halaman Kinerja di flutter.dev dan menambahkan instruksi untuk mengukur aplikasi.
Memperbaiki pengukuran dan logika tunggu bingkai pertama
- PR 37192: Reland “Memperbaiki logika bingkai pertama dalam pelacakan dan driver(#35297)”
- Memperbaiki Masalah 47108: Kebocoran Memori saat animasi diputar di iOS
DevTools menambahkan mode timeline penuh dengan dukungan untuk async dan pelacakan terekam.
Plugin IntelliJ memperbaiki dukungan 120FPS
Banyak perbaikan pelacakan timeline berkat ByteDance
- Gerrit 127920: [timeline] Menambahkan dukungan untuk kejadian asinkron timeline di pelacakan platform android
- Gerrit 128200: [timeline] mendukung ketersediaan kejadian vm untuk systrace
- Gerrit 127921: mendukung lebih banyak kejadian sync ketika menggunakan systrace untuk merekam kejadian timeline
- PR 14323: Memperbaiki streaming API yang hilang saat merekam kejadian di systrace
- PR 14521: Timeline dukungan bisa diaktifkan dalam mode rilis
- PR 14319: Memperbaiki kejadian timeline yang hilang pada waktu startup engine flutter
- PR 47742: memperbaiki durasi kejadian ringkasan timeline
- Gerrit 131360: Mendukung konversi timeline untuk pelacakan platform iOS
- PR 16520: Dukungan buffer jejak tanpa batas
- PR 47419: Dukungan perekam tanpa batas untuk timeline
Kuartal 3 (Juli-Sept) 2019
Peningkatan yang terukur
Percepatan 1,5–5x untuk transformasi rect & point
kontributor: flar, yjbanov, dnfield
- PR 37275: Pengoptimalan metode transformRect dan transformPoint di matrix_utils
- Percepatan 5,3x (2300 milidetik menjadi 430 milidetik) dalam MatrixUtils_affine_transformRect_iteration
- Percepatan 1,5x (466 milidetik menjadi 320 milidetik) dalam MatrixUtils_affine_transformPoint_iteration
N/2–1 lebih sedikit bingkai yang hilang saat scrolling iPhone X/Xs
kontributor: liyuqian, chinmaygarde, gaaclarke
- https://github.com/flutter/engine/pull/12385
- PR 12385: Reland “Memperlancar pengiriman kejadian input tidak biasa di iOS
- Mengurangi jumlah kasus terburuk dari bingkai yang hilang dari N/2 menjadi 1 dalam scroll bingkai N. Dalam praktiknya, bingkai N/10 biasanya ada yang hilang sebelum perbaikan.
- Memperbaiki salah satu masalah prioritas kami:
Masalah 31086: Kinerja scroll menurun secara signifikan pada perangkat iPhone X, Xs karena pengiriman kejadian input yang tidak biasa
Start dan shutdown engine 15% lebih cepat dengan inisialisasi paralel
kontributor: gaaclarke, chinmaygarde, liyuqian
- PR 10182: Mempercepat startup flutter dengan mengizinkan inisialisasi diparalelkan
- Percepatan 1,16x (3829377 nanodetik menjadi 3286713 nanodetik) dalam BM_ShellInitializationAndShutdown
Startup lebih cepat 14,57 milidetik dan penggunaan memori 8MB yang lebih kecil untuk shader warm-up
kontributor: gaaclarke, liyuqian, dnfield
- PR 36482: Mempercepat shader warm-up dengan hanya menggambar pada permukaan 100x100
- Menghemat 14,57 milidetik (18,848 milidetik menjadi 4,279 milidetik) dalam membaca/mengonversi piksel pada saat startup
- Menghemat 8MB (39220KB menjadi 31184KB) dalam memori median awal
- Menghemat 4MB (45034KB menjadi 40980KB) dalam memori median akhir
Pengurangan ukuran kode 1,02%-8,04%
kontributor: johnniwinther, aartbik, rmacnak-google, jensjoha, alexmarkov, mkustermann
- https://dart-review.googlesource.com/c/sdk/+/118280
- https://dart-review.googlesource.com/c/sdk/+/112758
- https://dart-review.googlesource.com/c/sdk/+/118181
- -8,04% (5,57MB menjadi 5,13MB) dalam armv8 animation_bench_instructions_size
- -2,7% (2,10MB menjadi 2,05MB) dalam armv7 flutter_gallery_readonlydata_size
- -1,22% (2,10MB menjadi 2,05MB) dalam armv7 layout_bench_instructions_size
Peningkatan hingga 2x untuk Flutter pada Fuchsia FPS; penjadwalan bingkai ditingkatkan
kontributor: dreveman, amott, rosswang, mikejurka
- https://fuchsia-review.googlesource.com/c/topaz/+/280230
- https://fuchsia-review.googlesource.com/c/topaz/+/286735
- https://fuchsia-review.googlesource.com/c/topaz/+/300135
- https://fuchsia-review.googlesource.com/c/topaz/+/306773
- https://fuchsia-review.googlesource.com/c/topaz/+/306772
- https://fuchsia-review.googlesource.com/c/topaz/+/307953
Perbaikan regresi terukur
Percepatan 3x untuk BackdropFilter di iOS
kontributor: lhkbob, liyuqian, flar
- https://skia-review.googlesource.com/c/skia/+/237904
- https://skia-review.googlesource.com/c/skia/+/234413
- https://github.com/flutter/flutter/pull/38814
- Percepatan 3x (110 milidetik menjadi 34 milidetik) dalam GM_savelayer_with_backdrop
- Regresi telah diperbaiki https://github.com/flutter/flutter/issues/36064
Untuk mencapai beberapa peningkatan besar (misalnya 3x), kinerja buruk kondisi masa lalu mungkin memainkan peran yang sama pentingnya dengan kerja keras dalam Kuartal 3 (Juli-Sept) 2019. Kami juga menandai beberapa perbaikan sebagai perbaikan tidak-biasa dari regresi yang sama besarnya. Meskipun demikian, kami menghargai pekerjaan tersebut. Tanpa itu, kami akan terus memiliki kinerja dan regresi yang buruk. Kami tidak ingin perbaikan besar mengerdilkan perbaikan yang lebih kecil. Mereka hanya tidak mendapatkan kinerja lama yang sangat buruk pada awalnya, yang dalam beberapa hal adalah hal baik.
Perbaikan lainnya
- DevTools mendukung tingkat refresh tampilan variabel (mis. 60 FPS, 120 FPS, dll.)
- Pemindaian plugin VSCode untuk proyek sekarang asinkron, yang tentunya akan meningkatkan kecepatan aktivasi ekstensi dan mengurangi kemungkinan terpicunya peringatan “ekstensi menyebabkan penggunaan CPU tinggi” dari VS Code. (#1840/#2003/#1961)
- iPhone Xs ditambahkan ke lab perangkat Flutter untuk dilakukan benchmark
Kesimpulan
Berkat kontribusi dari komunitas kami, proporsi pengguna yang sangat puas dengan kinerja seluler Flutter meningkat dari 85% pada Kuartal 3 2019 menjadi 92% pada 2020. Terlepas dari upaya terbaik kami, beberapa kontribusi kinerja pada Kuartal 3 - Kuartal 4 2019 mungkin terlewatkan dalam update ini. Harap jangan ragu untuk memberi tahu kami tentang kontribusi yang terlewatkan, dan kami akan memasukkannya dalam update berikutnya.