最佳化應用程式或頁面載入以獲得最佳效能
影響使用者對應用程式看法的關鍵因素之一是應用程式開啟和發揮功能的速度。 因此,優先考慮此目標對於建置高效能應用程式至關重要。 若要達到最佳應用程式效能,需要注意三個主要面向:
- 載入資料快速
- 高效計算
- 最小化必要的資源
這些領域中每個都有幾個常見的反模式。
載入資料快速
請遵循這些指南來實現快速資料載入應用程式。
避免直接用大量資料填入集合
有時,作者會使用 ClearCollect() 將資料從伺服器複製到應用程式中的集合。 這個做法是來源中委派限制的權宜解決之計,或他們因為其他目的計劃使用應用程式中的集合。 當稍後使用集合時,使用 ClearCollect() 可能會提高應用程式的速度。 但是,在實施時務必謹慎。 以這種方式使用 ClearCollect 可能會導致應用程式載入時間變慢或在頁面之間瀏覽時變慢。 ClearCollect() 必須先完成,然後您才能看到資料庫或表格中的資料。 如果有大量資料或您將此方法用於太多資料來源,則此步驟可能需要很長時間。 集合最適合資料較小且需要對集合進行大量計算的情況。 例如,線上訂購籃就是集合一個很好的使用範例。 在選擇提交訂單之前,客戶可能會多次更新和刪除商品。 此外,您可以使用更多資料項目 (例如潛在折扣、亮點等) 來擴充集合。「唯讀」資料應以本機方式存取 - 無需將其帶入集合中。
考慮避免調用 Power Automate 來填充集合
本問題與上一節略有不同。 有時作者也會使用 Power Automate 來填滿他們在 Power Apps 中的集合。 要實例化 Power Automate 大約需要 0.6 秒的效能成本。 Power Automate 每次調用時都必須獨立啟動。 它必須分配記憶體、放置正確的元件並準備好執行。 與上述建議一樣,對 Power Automate 的一兩次呼叫可能不是問題,這取決於您的應用程式。 但是,幾乎普遍來說,效能最差的應用程式都過度使用了這種方法。 效能成本會迅速增加且破壞應用程式的效能。
避免使用 SaveData() 和 LoadData() 作為完全離線案例
有些作者使用 ClearCollect() 然後使用 SaveData() 來儲存資料以供通用離線使用。 您可以使用 SaveData() 將集合儲存到您的裝置,並使用 LoadData() 在離線時載入它。 但是,對於資料量較大或資料複雜的情況,不建議使用此方法。 它會使您的應用程式變慢,因為它必須等待 ClearCollect() 完成才能顯示資料。 您應該只將 SaveData() 和 LoadData() 用於小型且簡單的資料情境,例如偏好選項和短清單。 處理大量離線資料的更好方法是使用與 Dataverse 搭配使用的 Power Apps離線功能 。 此功能可以更有效率地處理更大、更複雜的資料。
使用明確資料行選項
根據預設,明確資料行選項處於啟用狀態。 不過,有些作者會關閉此功能。 問題是,在明確資料行選項 (ECS) 開啟的情況下,如果先將資料擷取到集合中,有時就不會從資料來源檢索資料行。 由於某些表格可能有許多資料行,ECS 會根據控制項 (例如資源庫和表單) 中的使用情況,自動計算哪些資料行需要檢索。由於某些表格可能有許多資料行,因此減少下載的大小可以提高效能。 有些表格可以有一百個資料行或更多。 如果您的應用程式只需使用 10 個資料行,而您從一個有 100 個資料行的表格中取出所有資料行,則您取出的資料量是實際需要量的十倍。
大多數問題會出現在資料納入集合時。 如果在控制項中明確參考資料行,則 ECS 可以正常運作。 而且,ECS 通常適用於集合。 不過,當資料在集合和變數中移動時,資料行譜系有時會遺失。 且 Power Apps 可能會因此遺失它應該檢索的資料行。 若要解決此問題,您可以使用 ShowColumns
函數,強迫 Power Apps「記住」該資料行。 例如:
ClearCollect(
MyColTable,
ShowColumns(Filter(BankAccounts, AcountNo = 32),
"Col1",
"Col2",
"Col3")
);
其中 Col1
、Col2
和 Col3
是您希望從資料來源 (例如, Account
資料來源) 中檢索的資料行。
或者,您可以新增一個隱藏控制項到參考該資料行的表單。 這會強迫 Power Apps 「記住」該資料行。
快速計算
快速 (或有效率) 計算本身就是一個效能目標。 如需詳細資訊,請參閱快速 (有效率) 計算。 然而,有一些常見的反模式也會影響應用程式載入,因此我們會在這裡討論它們。 以下是您應該考慮,可能會影響應用程式啟動或頁面瀏覽的最佳化清單。
使用 App.Formulas
歷史上,許多作者都將大量的計算放在 OnStart 中。 當您在 OnStart 中放置運算式時,它會強制 Power Apps 在應用程式啟動時且在其他所有作業之前,精確執行該運算式。 但是,透過引入 App.Formulas,您可以讓 Power Apps 決定何時執行運算式。 Power Apps 可以在需要之前執行「Just-in-time」公式。 如需詳細資訊,請參閱應用程式公式。 使用 App.Formulas 將您的公式分成 Power Apps 可以更有效率安排執行的部分。
使用並行
使用並行函數以允許同時執行公式。 通常使用此函數來填入集合,因為它允許平行執行。 雖然這可以提供一些適度的加速,但新增許多資料來源可能會導致計時和節流問題。
使用隱藏控制項的增強效能
當 Power Apps 在 2022 年 12 月以來建立的所有新應用程式中預設為啟用時,它就不會呈現任何最初不可見的控制項。
最小化必要的資源
最大限度地減少啟動應用程式或畫面所需的資源。 這項工作包括仔細確定應用程式或畫面所需資源的範圍或資料分割。 以下是幾種可以幫助您的方法。
使用低相依性啟動畫面並消除未使用的畫面。
使用低相依性的第一個畫面,例如應用程式的歡迎畫面。 建立一個不載入資源庫、表格或參考資料的畫面。 這可以管理使用者對速度的感知,並允許 Power Fx 適當地將一些計算延遲到以後。 如果您有任何未使用的畫面,請將其移除。
保持畫面之間較低的跨畫面相依性
跨頁面引用強制透過引用載入其他頁面,例如引用頁面上的控制項並放入集合中。 有些引用可能是無法避免的。 如果可能,將常見引用集中到單一頁面,以便僅載入頁面。
考慮嵌入式媒體
作者有時會在他們的應用程式中嵌入媒體以確保快速載入。 如果您有嵌入式媒體,請認真思考您是否正在使用它。 如果沒有,請刪除它。 如果您嵌入了 .png 檔案,請考慮替換比較小的 .svg 檔案。 請注意,如果您使用 .svg,則 .svg 的字體必須位於用戶端電腦上。 考慮嵌入式媒體解析度。 對於將要使用的裝置來說,是否太高了?
不要忘記 App.StartScreen
如果您使用 App.StartScreen,請確保第一個畫面是空白畫面。 由於應用程式的當前套件,第一個邏輯畫面始終與應用程式初始邏輯綁定在一起,並且將被初始化,無論我們是否瀏覽到它。
考慮拆分應用程式
如果您的應用程式很大,請考慮將其分割為較小的應用程式。 如果應用程式不同部分的功能足夠獨立,則此方法可能有效。 在這種情境下,您建立一個實際的單獨應用程式,且使用包含來自第一個或父應用程式上下文的參數來啟動。
建議
若要達到快速應用程式和頁面開啟的目標,請考慮以下問題和建議:
- 您是否在第一個畫面中載入大量資料? 您可以使用不同的第一個畫面嗎?
- 您是否在應用程式載入開始時,執行了許多命令或 Power Fx 表達式? 您可以將這些命令和運算式推遲到應用程式的稍後位置嗎? 您只取了應用程式啟動實際需要的資料嗎? 1 能否使用 App.Formulas 將 App.OnStart 中的運算式轉換為命名公式? 這允許 Power Fx 決定何時實際執行公式,而不是強制它在載入或瀏覽事件上發生。
- 您是否可以使用單獨的 Power Automate 流程在本機資料存放區,例如結合不同來源之資料的 Dataverse 中建立臨時表格? 然後在 Power App 中存取該資料?
- 對於業務流程啟動,您可以使用伺服器觸發的動作而不是調用 Power Automate 流程?
- 您可以在伺服器上建立一個檢視表來為您聯結資料嗎?
- 如果你想在你的應用程式中使用離線資料,你可以使用搭配Dataverse 使用的 Power Apps 離線功能 ? 如果您的資料不在 Dataverse,你能把它移到那裡嗎?