比較 Compose 和 View 指標

Jetpack Compose 可加快 UI 開發速度並改善 Android 效能 。但請考量 將 Compose 新增至現有應用程式可能會影響應用程式的 APK 大小等指標。 建構與執行階段效能

APK 尺寸 和 建構 時間

本節將探討 Sunflower 範例應用程式 - 示範最佳做法的應用程式 並將以 View 為基礎的應用程式遷移至 Compose

APK 尺寸

在專案中新增程式庫會增加 APK 大小。後續結果如下 適用於各專案的經過壓縮版本 APK,其中包含資源和程式碼 已啟用縮減功能,使用 R8 完整模式,並使用 APK 分析工具進行測量。

僅供檢視 混合式 View 和 Compose 僅限 Compose
下載大小 2,252 KB 3,034 KB 2,966 KB

首次將 Compose 新增至 Sunflower 時,APK 大小從 2,252 KB 增加為 3,034 KB:增加 782 KB。產生的 APK 包含使用者介面版本 混合使用 View 和 Compose這類增幅預計將比 已將依附元件新增至 Sunflower。

相反地,Sunflower 遷移至僅使用 Compose 的應用程式時,APK 大小 從 3,034 KB 縮減為 2,966 KB,減少 68 KB。降幅為 移除未使用的 View 依附元件,例如 AppCompatConstraintLayout

建構時間

新增 Compose 時,Compose 編譯器會延長應用程式的建構時間 處理應用程式中的可組合項。下列結果是使用 獨立的 gradle-profiler 工具,會多次執行版本,因此 您能夠取得 1 個偵錯建構時間長度的平均建構時間 向日葵:

gradle-profiler --benchmark --project-dir . :app:assembleDebug
僅供檢視 混合式 View 和 Compose 僅限 Compose
平均建構時間 299.47 毫秒 399.09 毫秒 342.16 毫秒

首次將 Compose 新增至 Sunflower 時,建構時間平均會從 299 年增加 毫秒至 399 毫秒:增加 100 毫秒。這個時間長度是由 Compose 編譯器造成的 執行其他工作來轉換專案中定義的 Compose 程式碼。

相反地,平均建構時間則降至 342 毫秒,57 毫秒則下降到 342 毫秒。 Sunflower 的遷移作業已完成。這個縮減值可以歸因 共同縮短建構時間,例如移除資料 繫結、遷移使用 kapt 至 KSP 的依附元件,以及更新 幾項依附元件

摘要

採用 Compose 可有效增加應用程式的 APK 大小, 因為編譯程序而增加應用程式的建構時間效能 您學到了豐富的知識不過需要比較有利於 Compose 的優點,特別是提升開發人員工作效率 。舉例來說,Play 商店團隊發現 編寫 UI 所需的程式碼,有時最多達 50%, 提升程式碼的工作效率和可維護性

詳情請參閱「採用 Compose for Teams」一文。

執行階段效能

本節會說明 Jetpack Compose 執行階段效能的相關主題,以便 有助您瞭解 Jetpack Compose 與 View 系統的效能有何差異 以及評估方式

智慧 重組

當部分 UI 無效時,Compose 只會嘗試重組 需更新的部分詳情請參閱生命週期: 可組合項Jetpack Compose 說明文件。

基準設定檔

基準設定檔是 加快一般使用者歷程的絕佳方法。包含基準 從第一項應用程式開始,應用程式中的設定檔可將程式碼執行速度提高約 30% 未正確解釋應用程式的 所包含的程式碼路徑

Jetpack Compose 程式庫有自己的基準設定檔,您 在應用程式中使用 Compose 時,系統會自動取得這些最佳化作業。不過 這些最佳化設定只會影響 Compose 程式庫中的程式碼路徑,因此我們 建議您在自己的網站上新增基準設定檔 應用程式,以涵蓋 Compose 以外的程式碼路徑。

與 「視野」 系統 進行比較

Jetpack Compose 與 View 系統相比有多項改善。這些改善項目 。

所有 擴展 視野

在畫面上繪製的所有 View,例如 TextViewButtonImageView,需要記憶體配置、明確狀態追蹤和各種 回呼支援所有用途。此外,自訂 View 擁有者需要 執行明確的邏輯,避免在非 例如重複處理資料。

Jetpack Compose 有幾種方式 可以 解決 這個 問題, Compose 沒有明確的 繪圖檢視畫面的可更新物件。UI 元素是簡單的可組合函式 其資訊會以可重播的方式寫入樂曲。這有助於 將明確狀態追蹤、記憶體配置以及回呼 具有特定功能 (而非所有) 的可組合函式 指定 View 類型的副檔名。

此外,Compose 可提供智慧重組功能, 如果不需要進行變更,重播先前繪製的結果。

多重 配置 通行證

傳統的 ViewGroup 在測量方式和版面配置方面有許多表現優異之處 因此容易出現多次版面配置傳遞的 API。如果 是在 檢視 表階層的 特定 巢狀 點 執行, 這些 多重 配置 通行證 可能 會導致 指數的 工作。

Jetpack Compose 會強制執行單一版面配置傳遞 以便透過其 API 合約 設定所有版面配置可組合函式這讓 Compose 更有效率 可處理深層的 UI 樹狀結構如果需要多次測量,Compose 會 固有的測量資料

查看 啟動 效能

當 首次 顯示 特定 配置時, View 系統 需要 加載 XML 配置。由於 Jetpack Compose 的版面配置是 以 Kotlin 編寫,然後像應用程式的其餘部分進行編譯。

Compose 基準測試

在 Jetpack Compose 1.0 中, 應用程式 在 debugrelease 模式下的 效能 有顯著 差異。 為了 代表 時間, 在 剖析 應用程式時, 一律使用 release 建構 作業, 而非 debug

如要查看 Jetpack Compose 程式碼的效能,您可以使用 Jetpack Macrobenchmark 程式庫。如要瞭解操作方式 以便搭配 Jetpack Compose 使用,請參閱 MacrobenchmarkSample 專案

Jetpack Compose 團隊也會使用 Macrobenchmark 偵測 機構。如需範例,請參閱延遲資料欄的基準 及其資訊主頁 來追蹤迴歸問題

安裝 Compose 設定檔

由於 Jetpack Compose 是未封裝的程式庫,因此對 Zygote 預先載入 View 系統的程式庫並沒有任何優勢 UI 工具包類別和可繪項目。Jetpack Compose 1.0 會使用設定檔 安裝 release 版本的安裝作業。設定檔安裝程式可讓應用程式指定 在安裝時預先編譯 (AOT)。Compose 運輸 檔案 設定檔 規則, 以 減少 Compose 應用程式 中的 啟動時間 和 jank。