Bagikan melalui


Pengoptimalan kode

Seiring berkembangnya aplikasi kanvas untuk memenuhi kebutuhan bisnis yang berbeda, menjaga kinerja tetap optimal sangat penting. Penanganan data, desain antarmuka pengguna, dan fungsionalitas aplikasi semuanya memerlukan pendekatan yang cermat untuk pengoptimalan kode.

Saat aplikasi kanvas menjadi lebih kompleks, Anda dapat mengalami masalah dengan pengambilan data, kompleksitas rumus, dan kecepatan rendering. Menyeimbangkan fungsionalitas yang kuat dan antarmuka pengguna yang responsif berarti Anda memerlukan pendekatan sistematis untuk pengoptimalan kode.

Power Fx Pengoptimalan rumus

Dengan fungsi

Fungsi ini With mengevaluasi rumus untuk satu rekaman. Rumus dapat menghitung nilai atau melakukan tindakan, seperti memodifikasi data atau bekerja dengan koneksi. Gunakan With untuk membuat rumus kompleks lebih mudah dibaca dengan membaginya menjadi subrumus bernama yang lebih kecil. Nilai-nilai bernama ini bertindak seperti variabel lokal sederhana yang terbatas pada cakupan dari With. Menggunakan With lebih baik daripada konteks atau variabel global karena mandiri, mudah dipahami, dan berfungsi dalam konteks rumus deklaratif apa pun. Pelajari fungsi ini lebih lanjut With .

Tangkapan layar rumus Power Fx yang menggunakan fungsi With.

Fungsi bersamaan

Fungsi ini Concurrent memungkinkan beberapa rumus dalam properti yang sama untuk dievaluasi secara bersamaan jika mereka memiliki konektor atau Dataverse panggilan. Biasanya, beberapa rumus dievaluasi secara bersamaan saat Anda merantainya dengan ; operator (titik koma). Dengan Concurrent, aplikasi mengevaluasi semua rumus dalam properti secara bersamaan, bahkan setelah menggunakan ; operator. Konkurensi ini berarti pengguna lebih jarang menunggu hasil. Saat panggilan data tidak dimulai hingga panggilan sebelumnya selesai, aplikasi menunggu jumlah semua waktu permintaan. Jika panggilan data dimulai pada saat yang sama, aplikasi hanya menunggu waktu permintaan terlama. Pelajari fungsi ini lebih lanjut Concurrent .

Concurrent(
    ClearCollect(colAccounts1, Accounts),
    ClearCollect(colUsers1, Users),
    ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
    ClearCollect(colEnvVal1, 'Environment Variable Values')
);

Fungsi Penggabungan

Fungsi mengevaluasi Coalesce argumennya secara berurutan dan mengembalikan nilai pertama yang tidak kosong atau string kosong. Gunakan fungsi ini untuk mengganti nilai kosong atau string kosong dengan nilai yang berbeda, tetapi biarkan nilai string nonblank dan nonempty tidak berubah. Jika semua argumen kosong atau string kosong, fungsi mengembalikan kosong. Coalesce adalah cara yang baik untuk mengonversi string kosong menjadi nilai kosong.

Contoh:

If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)

Mengharuskan nilai 1 dan nilai 2 dievaluasi dua kali. Fungsi ini dapat dikurangi menjadi:

Coalesce(value1, value2)

Fungsi IsMatch

Fungsi ini IsMatch menguji apakah string teks cocok dengan pola yang terdiri dari karakter biasa, pola yang telah ditentukan sebelumnya, atau ekspresi reguler. Pelajari fungsi ini lebih lanjut IsMatch .

Misalnya, rumus ini cocok dengan nomor Jaminan Sosial Amerika Serikat:

IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")

Penjelasan ekspresi reguler:

\\d Cocok dengan digit apa pun (0-9).

{3} Menentukan bahwa pola digit sebelumnya (\d) harus terjadi tepat tiga kali.

- Cocok dengan karakter tanda hubung.

{2} Menentukan bahwa pola digit sebelumnya (\d) harus terjadi tepat dua kali.

{4} Menentukan bahwa pola digit sebelumnya (\d) harus terjadi tepat empat kali.

Contoh IsMatch lainnya:

IsMatch(TextInput1.Text, "Hello World")
IsMatch(TextInput1\_2.Text, "(?!^\[0-9\]\\\*$)(?!^\[a-zA-Z\]\\\*$)(\[a-zA-Z0-9\]{8,10})")

Mengoptimalkan aplikasi OnStart

Properti OnStart untuk aplikasi cavas memainkan peran penting dalam menentukan tindakan yang terjadi saat aplikasi diluncurkan. Properti ini memungkinkan developer aplikasi menjalankan tugas inisialisasi global, menyiapkan variabel, dan melakukan tindakan yang seharusnya hanya terjadi sekali selama proses startup aplikasi. Memahami dan memanfaatkan properti secara OnStart efektif sangat penting untuk membuat aplikasi kanvas yang responsif dan efisien.

Pendekatan yang direkomendasikan adalah merampingkan App.OnStart fungsi dengan memigrasikan pengaturan variabel ke rumus bernama. Rumus bernama, terutama yang dikonfigurasi di awal siklus hidup aplikasi, terbukti menguntungkan. Rumus ini menangani inisialisasi variabel berdasarkan panggilan data, memberikan struktur yang lebih bersih dan lebih terorganisir untuk kode Anda. Detail selengkapnya Buat aplikasi kanvas yang besar dan kompleks - Power Apps | Microsoft Learn.

Catatan

Properti OnStart adalah Imperatif. Ini adalah daftar pekerjaan yang tertib yang perlu dilakukan sebelum layar pertama ditampilkan. Karena sangat spesifik tidak hanya tentang apa yang perlu dilakukan, tetapi juga kapan pekerjaan itu harus dilakukan berdasarkan urutan, itu membatasi penyusunan ulang dan penundaan pengoptimalan yang seharusnya dapat dilakukan.

Layar mulai

Jika App.OnStart berisi Navigate panggilan fungsi, meskipun ada di fungsi If dan jarang dipanggil, kita harus menyelesaikan eksekusi Aplikasi. OnStart sebelum kami menampilkan layar pertama aplikasi.  App.StartScreen adalah cara deklaratif baru untuk menunjukkan layar mana yang harus ditampilkan terlebih dahulu, yang tidak menghalangi pengoptimalan.

Mengatur StartScreen properti akan menampilkan layar pertama sebelum App.OnStart selesai. App.StartScreen declares objek layar mana yang akan ditampilkan terlebih dahulu tanpa memerlukan prapemrosesan apa pun.

Alih-alih menulis kode seperti:

App.OnStart = Collect(OrdersCache, Orders);
If(Param("AdminMode") = "1", Navigate(AdminScreen), Navigate(HomeScreen))

Ubah kode menjadi:

App.OnStart = Collect(OrdersCache, Orders);
App.StartScreen = If(Param("AdminMode") = "1", AdminScreen, HomeScreen)

Lihat <https://Power Apps.microsoft.com/en-us/blog/app-startscreen-a-new-declarative-alternative-to-navigate-in-app-onstart/> untuk lebih jelasnya.

Peringatan

Hindari dependensi antara StartScreen dan OnStart. Mereferensikan rumus bernama yang pada gilirannya mereferensikan variabel global dapat menyebabkan kondisi balapan yang StartScreen tidak diterapkan dengan benar. Catatan: kita seharusnya tidak memiliki dependensi antara StartScreen dan OnStart. Kami memblokir referensi variabel global di StartScreen, tetapi kami dapat mereferensikan rumus bernama, yang pada gilirannya mereferensikan variabel global, dan itu dapat menyebabkan kondisi balapan di mana StartScreen tidak diterapkan dengan benar.

Rumus bernama

Rumus bernama adalah statis atau konstanta yang dapat didefinisikan di bagian App.Formulas. Setelah dideklarasikan di App.Formulas, mereka dapat digunakan di mana saja di aplikasi dan nilainya selalu tetap diperbarui. Rumus Bernama dalam Power Apps memungkinkan definisi nilai atau kumpulan nilai yang dikelola dan diperbarui secara otomatis oleh platform. Fungsionalitas ini mentransfer tanggung jawab perhitungan dan pemeliharaan nilai dari pengembang ke, Power Apps merampingkan proses pengembangan. Rumus Bernama Power Apps dalam adalah fungsionalitas canggih yang dapat meningkatkan performa dan pemeliharaan aplikasi secara signifikan.

Rumus bernama juga dapat ditangani mendeklarasikan tema aplikasi. Dalam banyak kasus di mana aplikasi perusahaan dibuat, kami ingin aplikasi memiliki tema umum untuk memberikan tampilan dan pengalaman pengguna yang konsisten. Untuk membuat tema, ada 10-an dan 100-an variabel yang perlu dideklarasikan di App OnStart. Ini meningkatkan panjang kode dan waktu inisialisasi aplikasi.

Kontrol modern juga dapat membantu secara signifikan dengan tema dan membantu mengurangi logika tertulis pelanggan untuk menangani tema. Kontrol modern saat ini dalam pratinjau.

Misalnya, kode on App.OnStart berikut dapat dipindahkan App.Formulas, sehingga mengurangi waktu startup pada deklarasi variabel global.

Set(BoardDark, RGBA(181,136,99, 1));
Set(BoardSelect, RGBA(34,177,76,1));
Set(BoardRowWidth, 10);                      // expected 8 plus two guard characters for regular expressions.
Set(BoardMetadata, 8 \* BoardRowWidth + 1);   // which player is next, have pieces moved for castling rules, etc.
Set(BoardBlank, "----------------------------------------------------------------\_00000000000000");
Set(BoardClassic, "RNBQKBNR\_\_PPPPPPPP------------------------\_--------\_\_pppppppp\_\_rnbqkbnr\_\_0000000000");

Kode dapat dipindahkan ke App.Formulas sebagai berikut:

BoardSize = 70;
BoardLight = RGBA(240,217,181, 1);
BoardDark = RGBA(181,136,99, 1);
BoardSelect = RGBA(34,177,76,1);
BoardRowWidth = 10;                      // expected 8 plus two guard characters for regular expressions
BoardMetadata = 8 \* BoardRowWidth + 1;   // which player is next, have pieces moved for castling rules, etc.
BoardBlank = "----------------------------------------------------------------\_00000000000000";
BoardClassic = "RNBQKBNR\_\_PPPPPPPP------------------------\_--------\_\_pppppppp\_\_rnbqkbnr\_\_0000000000";

Contoh lain adalah pengaturan Lookups penginapan. Di sini, perubahan diperlukan dalam rumus Pencarian untuk mendapatkan informasi pengguna dari Office 365, bukan Dataverse. Hanya ada satu tempat perubahan diperlukan tanpa mengubah kode di mana-mana.

UserEmail = User().Email;
UserInfo = LookUp(Users, 'Primary Email' = User().Email);
UserTitle = UserInfo.Title;
UserPhone = Switch(UserInfo.'Preferred Phone', 'Preferred Phone (Users)'.'Mobile Phone', UserInfo.'Mobile Phone',
UserInfo.'Main Phone');

Rumus-rumus ini mewujudkan esensi perhitungan. Mereka mengartikulasikan proses untuk menentukan UserEmail, UserInfo, UserTitle, dan UserPhone berdasarkan nilai-nilai lain. Logika ini dienkapsulasi, memungkinkan pemanfaatan luas di seluruh aplikasi, dan dapat dimodifikasi di lokasi tunggal. Kemampuan beradaptasi meluas untuk beralih dari Dataverse tabel Pengguna ke Office 365 konektor tanpa memerlukan perubahan pada rumus yang tersebar di seluruh aplikasi.

Pendekatan lain adalah mengoptimalkan countRows.

varListItems = CountRows(SampleList)

Dengan Set Function, variabel varListItems harus diinisialisasi dengan jumlah awal baris dalam daftar sampel dan diatur lagi setelah item daftar ditambahkan atau dihapus. Dengan rumus Bernama, saat data berubah, variabel varListitems diperbarui secara otomatis.

Rumus Bernama di App.Formulas properti memberikan pendekatan yang lebih fleksibel dan deklaratif untuk mengelola nilai dan perhitungan di seluruh aplikasi, menawarkan keuntungan dalam hal independensi waktu, pembaruan otomatis, pemeliharaan, dan definisi yang tidak dapat diubah dibandingkan dengan hanya mengandalkan App.OnStart.

Aspek Rumus Bernama (App.Formulas) Aplikasi.Mulai
Kemandirian Waktu Rumus tersedia secara instan, dapat dihitung dalam urutan apa pun. Variabel dapat memperkenalkan dependensi waktu, yang memengaruhi ketersediaan.
Pembaruan Otomatis Rumus diperbarui secara otomatis saat dependensi berubah. Variabel diatur sekali selama startup; pembaruan manual mungkin diperlukan.
Pemeliharaan Rumus terpusat di satu lokasi meningkatkan pemeliharaan. Variabel yang tersebar mungkin memerlukan pencarian dan pembaruan di beberapa tempat.
Definisi yang Tidak Dapat Diubah Definisi rumus di App.Formulas tidak dapat diubah. Nilai variabel mungkin rentan terhadap perubahan yang tidak disengaja.

Fungsi yang ditentukan pengguna

Fungsi yang Ditentukan Pengguna di Power Apps Authoring Studio memungkinkan pengguna membuat fungsi kustom mereka sendiri.

Untuk menggunakan fitur ini, di bawah pengaturan pratinjau, aktifkan Fungsi yang ditentukan pengguna (UDF). Fungsionalitas pratinjau tidak boleh digunakan dalam produksi, itulah sebabnya fungsionalitas ini dinonaktifkan secara default, tetapi akan segera tersedia secara umum.

Tentukan rumus sebagai App.Formulas berikut:

FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula

Kode ini bekerja seperti ini:

  • FunctionName digunakan untuk memanggil fungsi

  • Parameter adalah nama input. Satu atau lebih input diizinkan

  • DataType adalah argumen yang diteruskan ke fungsi harus cocok dengan jenis data ini. Tipe data yang tersedia termasuk Boolean, Warna, Tanggal, Tanggalwaktu, Dinamis, GUID, Hyperlink, Teks, dan Waktu

  • OutputDataType adalah jenis data output fungsi yang akan berada

  • Formula adalah output dari fungsi

// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number = 
    IfError(Pi() * radius * radius, 0);

Gunakan IfError untuk menerapkan penanganan kesalahan dalam fungsi yang ditentukan.

Panggil fungsi yang ditentukan dari kontrol teks/label.

calcAreaOfCircle(Int(*TextInput1*.Text))

Catatan

Ini adalah fitur eksperimental dan dapat berubah. Beberapa jenis data, seperti rekaman dan filter, belum didukung.

Mengoptimalkan variabel

Variabel menentukan dan menetapkan nilai lokal dan global yang Anda gunakan di seluruh aplikasi. Meskipun nyaman, menggunakan terlalu banyak variabel dapat membuat aplikasi Anda kurang efisien.

Contoh berikut menunjukkan cara mengatur variabel untuk setiap atribut objek, yang memerlukan penggunaan Set untuk setiap properti.

Set(varEmpName, Office365Users.MyProfile().DisplayName);
Set(varEmpCity, Office365Users.MyProfile().City);
Set(varEmpPhone, Office365Users.MyProfile().BusinessPhones);
Set(varEmpUPN, Office365Users.MyProfile().UserPrincipalName);
Set(varEmpMgrName, Office365Users.ManagerV2(varEmpUPN).DisplayName);

Pendekatan yang lebih efisien adalah menggunakan properti hanya saat Anda membutuhkannya:

Set(varEmployee, Office365Users.MyProfile())
"Welcome " & varEmployee.DisplayName

Gunakan variabel konteks dan variabel global dengan bijak. Jika cakupan variabel melampaui satu layar, gunakan variabel global, bukan variabel konteks.

Terlalu banyak variabel yang tidak digunakan meningkatkan penggunaan memori dan dapat memperlambat inisialisasi aplikasi. Sumber daya dialokasikan untuk variabel ini meskipun Anda tidak menggunakannya. Variabel yang tidak digunakan juga menambah kerumitan pada logika aplikasi Anda. Meskipun dampaknya mungkin tidak parah, ini adalah praktik yang baik untuk menjaga Power App Anda tetap bersih dan teratur untuk kinerja yang lebih baik dan pengembangan yang lebih mudah.

Mengoptimalkan koleksi

Koleksi adalah struktur penyimpanan data sementara yang Anda gunakan untuk menyimpan dan memanipulasi data dalam Power Apps aplikasi. Tetapi koleksi dapat menyebabkan overhead kinerja jika Anda menggunakannya terlalu banyak. Batasi penggunaan koleksi Anda dan gunakan hanya jika diperlukan.

// Use this pattern
ClearCollect(colErrors, {Text: gblErrorText, Code: gblErrorCode});

// Do not use this pattern
Clear(colErrors);
Collect(colErrors, {Text: gblErrorText, Code: gblErrorCode});

Untuk menghitung rekaman dalam koleksi lokal, gunakan CountIf alih-alih Count(Filter())

Pertimbangkan panduan ini saat bekerja dengan koleksi:

Batasi ukuran dan jumlah koleksi. Karena koleksi bersifat lokal ke aplikasi, koleksi tersebut disimpan di memori perangkat seluler. Semakin banyak koleksi data yang disimpan, atau semakin banyak koleksi yang Anda gunakan, semakin buruk performanya. Gunakan fungsi untuk ShowColumns mendapatkan hanya kolom tertentu. Tambahkan Filter fungsi untuk hanya mendapatkan data yang relevan.

Contoh fungsi berikut mengembalikan seluruh himpunan data.

ClearCollect(colDemoAccount, Accounts);

Bandingkan ini dengan kode berikut, yang hanya mengembalikan rekaman dan kolom tertentu:

ClearCollect(colAcc,
              ShowColumns(
                Filter(Accounts, !IsBlank('Address 1: City')),
                "name","address1_city"))

Contoh ini mengembalikan himpunan data berikut:

Tangkapan layar himpunan data dengan tabel bernama colAcc dan dua kolom, address1_city dan nama.

Atur frekuensi refresh sumber data. Jika Anda menambahkan rekaman baru ke koleksi, muat ulang atau kumpulkan untuk mendapatkan rekaman baru atau yang diubah. Jika beberapa pengguna memperbarui sumber data Anda, segarkan koleksi untuk mendapatkan data baru atau yang diubah. Lebih banyak panggilan refresh berarti lebih banyak interaksi dengan server.

Cache data dalam koleksi dan variabel

Koleksi adalah variabel tabel yang menyimpan baris dan kolom data, bukan hanya satu item data. Koleksi berguna karena dua alasan utama: menggabungkan data sebelum mengirimkannya ke sumber data, dan menyimpan informasi dalam cache untuk menghindari kueri yang sering. Karena koleksi cocok dengan struktur tabel sumber data dan Power Apps, koleksi tersebut memungkinkan Anda berinteraksi dengan data secara efisien, bahkan saat Anda offline.

// Clear the contents of EmployeeCollection, it already contains data
ClearCollect(
    colEmployee,
    {
        Id: "1",
        Name: "John",
        Department: "IT"
    },
    {
        Id: "2",
        Name: "Nestor",
        Department: "IT"
    }
)

Menghapus variabel dan media yang tidak digunakan

Meskipun media dan variabel yang tidak digunakan mungkin tidak berdampak signifikan pada performa aplikasi, penting untuk membersihkan aplikasi Anda dengan menghapus media atau variabel yang tidak digunakan.

  • File media yang tidak digunakan meningkatkan ukuran aplikasi, yang dapat memperlambat waktu muat aplikasi.

  • Variabel yang tidak digunakan meningkatkan penggunaan memori dan dapat sedikit memperlambat inisialisasi aplikasi. Sumber daya dialokasikan untuk variabel ini meskipun tidak digunakan. Terlalu banyak variabel yang tidak digunakan juga dapat membuat logika aplikasi lebih kompleks.

  • Gunakan Pemeriksa Aplikasi untuk meninjau media dan variabel yang tidak digunakan.

Mengoptimalkan layar dan kontrol

Hindari kontrol referensi silang

Kontrol yang mereferensikan kontrol di layar lain dapat memperlambat pemuatan dan navigasi aplikasi. Melakukan ini dapat memaksa aplikasi untuk segera memuat layar lain, daripada menunggu hingga pengguna membuka layar tersebut. Untuk memperbaiki masalah ini, gunakan variabel, koleksi, dan konteks navigasi untuk membagikan status di seluruh layar.

Pemeriksa aplikasi di Power Apps Studio menampilkan kontrol yang direferensikan silang. Tinjau Pemeriksa aplikasi secara teratur untuk memperbaiki masalah ini.

Berikut adalah contoh kontrol referensi silang. Pada gambar di bawah ini, kontrol Galeri 1 direferensikan silang di Layar 2, kontrol Label 2.

Tangkapan layar menampilkan Power Apps Studio kontrol referensi silang.

Jika Anda mereferensikan kontrol dari layar pertama di aplikasi di layar kedua, tidak ada hit performa karena layar pertama sudah dimuat. Ini sebenarnya bisa menjadi hal yang baik karena aplikasi bersifat deklaratif alih-alih menggunakan variabel.

Jika Anda mereferensikan kontrol yang belum dimuat, seperti layar pertama yang mereferensikan kontrol bernama Label 3 dari layar 3, aplikasi akan memuat layar tersebut ke dalam memori.

Aktifkan DelayOutput untuk kontrol teks

Pengaturan DelayOutput, ketika diatur ke true, mendaftarkan input pengguna setelah penundaan setengah detik. Ini berguna untuk menunda operasi yang mahal hingga pengguna selesai memasukkan teks, seperti pemfilteran saat input digunakan dalam rumus lain.

Misalnya, untuk Galeri yang Itemnya Difilter tergantung pada apa yang dimasukkan pengguna dalam kontrol TextInput:

  • Dengan DelayOutput diatur ke false, yang merupakan default, galeri akan difilter segera setelah teks diketik. Jika Anda memiliki galeri dengan banyak item, memuat ulang galeri dengan perubahan segera memperlambat kinerja. Lebih baik menunggu sebentar. Ini praktis saat Anda menggunakan TextInput untuk string pencarian (lihat Pencarian atau fungsi StartsWith baru).

  • Dengan DelayOutput diatur ke true, ada penundaan singkat sebelum perubahan terdeteksi. Ini memberi Anda waktu untuk menyelesaikan pengetikan. Penundaan berfungsi dengan baik dengan properti TextInput.OnChange. Jika Anda memiliki tindakan yang terkait dengan perubahan, Anda tidak ingin tindakan tersebut dipicu hingga Anda selesai mengetik di kolom.

Pemrosesan delegasi dan sisi server

Delegasi

Delegasi masuk Power Apps adalah konsep yang mengacu pada kemampuan aplikasi untuk membongkar operasi tertentu ke sumber data yang mendasarinya daripada memproses operasi di dalamnya Power Apps sendiri. Dengan menggunakan delegasi Power Apps, pengembang dapat membuat aplikasi yang lebih efisien dan dapat diskalakan yang berkinerja baik bahkan dalam skenario yang melibatkan himpunan data besar. Penting untuk mengetahui batasan delegasi untuk sumber data dan operasi tertentu, dan merancang aplikasi yang sesuai untuk mencapai performa yang optimal.

! [CATATAN] Tidak semua fungsi dapat didelegasikan. Silakan lihat Memahami Delegasi untuk mempelajari lebih lanjut tentang delegasi.

Delegasi memiliki beberapa keunggulan seperti pengoptimalan Kueri dan menambahkan dukungan untuk himpunan data besar. Selain itu, jika data sumber sering berubah, delegasi membantu menjaga data tetap mutakhir.

Mengurangi panggilan API ke sumber data

Terkadang, membuat koleksi tampak nyaman dengan melakukan gabungan dalam aplikasi kanvas Anda. Berikut adalah contohnya:

Dalam contoh ini, ada dua tabel: Pengemudi dan Truk. Kode tersebut membuat kumpulan pengemudi dan detail truk, dan untuk setiap truk, kode tersebut memanggil pengemudi yang memiliki truk.

// Bad code
ClearCollect(vartruckdata, AddColumns('Truck Details',
    "CITY",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],City),
        "FIRSTNAME",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],'Driver First Name'),
    "LASTNAME",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],'Driver Last Name'),
        "STATE",LookUp(Drivers, 'Truck Details'\[@'Dummy ID'\] = Drivers\[@'Truck Details'\],State)));

Melakukan gabungan tersebut di aplikasi kanvas dapat menghasilkan banyak panggilan ke sumber data, yang menyebabkan waktu pemuatan yang lambat.

Pendekatan yang lebih baik adalah:

// Good code
Set(
    varTruckData,
    LookUp(
        Drivers,
        'Dummy ID' = ThisRecord.'Dummy ID',
        'Driver First Name'
    ) & LookUp(
        Drivers,
        'Dummy ID' = ThisRecord.'Dummy ID',
        'Driver Last Name'
        )
);

Set(
    varTruckData,
    With(
        {
            vDriver: LookUp(
                Drivers,
                'Dummy ID' = ThisRecord.'Dummy ID'
            )
        },
        vDriver.'Driver First Name' & vDriver.'Driver Last Name'
    )
)

Dalam skenario waktu nyata, Anda dapat mengurangi waktu pemuatan dari lima menit menjadi di bawah 10 detik dengan memperbaiki data di sumbernya.

Pemrosesan sisi server

Sumber data yang berbeda, seperti SQL dan Dataverse, memungkinkan Anda mendelegasikan pemrosesan data, seperti filter dan pencarian, ke sumber data. Di SQL Server, Anda dapat membuat tampilan yang ditentukan oleh kueri. Selain itu Dataverse, Anda dapat membuat plugin low-code untuk memproses data di server dan hanya mengembalikan hasil akhir ke aplikasi kanvas Anda.

Mendelegasikan pemrosesan data ke server dapat meningkatkan performa, mengurangi kode sisi klien, dan membuat aplikasi Anda lebih mudah dipelihara.

Pelajari plugin lebih lanjut di . Dataverse

Mengoptimalkan pola data kueri

Menggunakan pemilihan kolom eksplisit

Fitur Pemilihan Kolom Eksplisit (ECS) aktif secara default untuk semua aplikasi baru. Jika tidak aktif untuk aplikasi Anda, aktifkan. ECS secara otomatis mengurangi jumlah kolom yang diambil menjadi hanya yang digunakan di aplikasi. Jika ECS tidak aktif, Anda mungkin mendapatkan lebih banyak data daripada yang Anda butuhkan, yang dapat memengaruhi performa. Terkadang, saat aplikasi mendapatkan data melalui pengumpulan, sumber asli kolom dapat hilang. ECS menjatuhkan kolom jika tidak dapat mengetahui bahwa kolom tersebut digunakan. Untuk memaksa ECS menyimpan kolom yang hilang, gunakan ekspresi ShowColumns PowerFx setelah referensi koleksi atau dalam kontrol.

Hindari menelepon Power Automate untuk mengisi koleksi

Praktik umum adalah digunakan Power Automate untuk mengambil dan mengisi koleksi Power Apps. Meskipun pendekatan ini valid, ada situasi di mana itu mungkin bukan pilihan yang paling efisien. Panggilan Power Automate dilengkapi dengan overhead latensi jaringan dan menambahkan biaya performa 0,6 detik untuk membuat instance alur Power Automate .

Penggunaan Power Automate alur yang berlebihan juga dapat menyebabkan batas eksekusi dan pembatasan. Oleh karena itu, selalu evaluasi trade-off antara latensi jaringan dan biaya kinerja.

Hilangkan masalah N+1

Masalah N+1 adalah masalah umum dalam kueri database di mana, alih-alih mengambil semua data yang diperlukan dalam satu kueri, beberapa kueri tambahan dibuat untuk mengambil data terkait. Hal ini dapat menyebabkan masalah performa, karena setiap kueri tambahan menimbulkan overhead.

Panggilan sederhana seperti ini untuk memuat koleksi dapat menghasilkan panggilan N+1 ke sumber data.

ClearCollect(MyCollection, OrdersList,
    {
        LookUp(CustomersList,CustomerID = OrdersList[@CustomerID])
    }
)

Dalam konteks aplikasi dan galeri kanvas, masalah N+1 mungkin muncul saat bekerja dengan sumber data dan galeri yang menampilkan catatan terkait. Masalah biasanya terjadi ketika lebih banyak kueri dibuat untuk setiap item yang ditampilkan di galeri, yang menyebabkan kemacetan performa.

Gunakan objek Tampilan di SQL Server untuk menghindari masalah kueri N+1, atau ubah antarmuka pengguna untuk menghindari pemicu skenario N+1.

Dataverse Secara otomatis mengambil data yang diperlukan dari tabel terkait dan Anda dapat memilih kolom dari tabel terkait.

ThisItem.Account.'Account Name'

Jika RelatedDataSourcukuran e' kecil (<500 rekaman), Anda dapat meng-cachenya dalam koleksi dan menggunakan koleksi untuk mendorong skenario kueri Pencarian (N+1).

Membatasi ukuran paket

Meskipun Power Apps banyak hal untuk mengoptimalkan pemuatan aplikasi, Anda dapat mengambil langkah-langkah untuk mengurangi jejak aplikasi Anda. Jejak yang dikurangi sangat penting bagi pengguna perangkat lama, atau pengguna di lokal yang memiliki latensi lebih tinggi atau bandwidth yang berkurang.

  • Evaluasi media yang disematkan di aplikasi Anda. Jika ada sesuatu yang tidak digunakan, hapus.

  • Gambar yang disematkan mungkin terlalu besar. Alih-alih file PNG, lihat apakah Anda dapat menggunakan gambar SVG. Namun, berhati-hatilah dalam menggunakan teks dalam gambar SVG, karena font yang digunakan harus diinstal di klien. Solusi yang bagus saat Anda perlu menampilkan teks adalah dengan menumpangkan label teks di atas gambar.

  • Evaluasi apakah resolusi sesuai untuk faktor bentuk. Resolusi untuk aplikasi seluler tidak harus setinggi resolusi untuk aplikasi desktop. Bereksperimenlah untuk mendapatkan keseimbangan yang tepat antara kualitas dan ukuran gambar.

  • Jika Anda memiliki layar yang tidak digunakan, hapus. Berhati-hatilah untuk tidak menghapus layar tersembunyi yang hanya digunakan oleh pembuat aplikasi atau administrator.

  • Evaluasi apakah Anda mencoba memasukkan terlalu banyak alur kerja ke dalam satu aplikasi. Misalnya, apakah Anda memiliki layar admin dan layar klien di aplikasi yang sama? Jika demikian, pertimbangkan untuk membaginya menjadi satu aplikasi individual. Pendekatan ini juga akan memudahkan banyak orang untuk mengerjakan aplikasi secara bersamaan, dan membatasi "radius ledakan" (jumlah pengujian) saat perubahan aplikasi memerlukan kelulusan pengujian penuh.

Optimalkan ForAll

Fungsi ForAll dalam Power Apps digunakan untuk mengulangi tabel rekaman dan menerapkan rumus atau sekumpulan rumus ke setiap rekaman. Meskipun fungsinya sendiri serbaguna, penggunaan fungsi ForAll yang tidak tepat dapat dengan cepat membuat aplikasi Anda kurang berkinerja.

Fungsi ForAll adalah fungsi berurutan tunggal, bukan fungsi bersamaan. Oleh karena itu ia hanya melihat satu catatan pada satu waktu, mendapatkan hasilnya, kemudian berlanjut ke catatan berikutnya sampai telah melewati semua catatan dalam ruang lingkupnya.

Hindari Nesting ForAll dengan cara apa pun. Hal ini dapat menyebabkan iterasi eksponensial dan berdampak signifikan pada kinerja.

ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))

Pembaruan batch ke Database

ForAll + Patch dapat menjadi salah satu pendekatan untuk memperbarui database Batch. Namun, berhati-hatilah dalam menggunakan urutan For All dan Patch.

Fungsi berikut:

Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
    {
        demoName:"fromCanvas2"
    })
);

Berkinerja lebih baik dari:

ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
    {
        demoName:"test"
    })
);

Langkah selanjutnya