Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 penyajian. Untuk menyeimbangkan fungsionalitas yang kuat dengan antarmuka pengguna yang responsif, gunakan pendekatan sistematis untuk pengoptimalan kode.
Pengoptimalan rumus Power Fx
Bagian ini menyediakan praktik terbaik untuk mengoptimalkan rumus Power Fx.
Dengan fungsi
Fungsi With ini 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.
With lebih baik daripada konteks atau variabel global karena mandiri, mudah dipahami, dan berfungsi dalam konteks rumus deklaratif apa pun. Pelajari selengkapnya tentang fungsi With.
Fungsi Concurrent
Fungsi Concurrent memungkinkan beberapa rumus dalam properti yang sama untuk dievaluasi secara bersamaan jika mereka memiliki konektor atau panggilan Dataverse. Biasanya, beberapa rumus dievaluasi secara bersamaan ketika Anda menghubungkannya dengan operator titik koma ;. Dengan Concurrent, aplikasi mengevaluasi semua rumus dalam properti secara bersamaan, bahkan setelah menggunakan ; operator. Konkurensi ini berarti pengguna menunggu lebih sedikit waktu untuk hasil. Saat panggilan data tidak dimulai sampai panggilan sebelumnya selesai, aplikasi menunggu total waktu permintaan. Jika panggilan data dimulai pada saat yang sama, aplikasi hanya menunggu waktu permintaan terlama. Pelajari selengkapnya tentang fungsi Bersamaan.
Concurrent(
ClearCollect(colAccounts1, Accounts),
ClearCollect(colUsers1, Users),
ClearCollect(colEnvDef1, 'Environment Variable Definitions'),
ClearCollect(colEnvVal1, 'Environment Variable Values')
);
Fungsi coalesce
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. Pelajari selengkapnya tentang fungsi Coalesce.
Contoh ini mengharuskan value1 dan value2 dievaluasi dua kali:
If(Not IsBlank(value1), value1, Not IsBlank(value2), value2)
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 selengkapnya tentang fungsi IsMatch.
Misalnya, rumus ini cocok dengan nomor Jaminan Sosial Amerika Serikat:
IsMatch(TextInput1.Text, "\d{3}-\d{2}-\d{4}")
Penjelasan ekspresi reguler:
\\dCocok dengan digit apa pun (0-9).{3}Menentukan bahwa pola digit sebelumnya (\d) harus terjadi tepat tiga kali.-Mencocokkan 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 kanvas 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. Pahami dan gunakan OnStart properti secara efektif untuk membuat aplikasi kanvas yang responsif dan efisien.
Menyederhanakan fungsi App.OnStart dengan memigrasikan pengaturan variabel ke rumus bernama. Rumus bernama, terutama yang dikonfigurasi pada tahap awal dalam siklus hidup aplikasi, memiliki keuntungan tersendiri. Rumus ini menangani inisialisasi variabel berdasarkan panggilan data, memberikan struktur yang lebih bersih dan lebih terorganisir untuk kode Anda. Pelajari selengkapnya di Membangun aplikasi kanvas yang besar dan kompleks.
Note
Properti OnStart ini sangat penting. Ini adalah daftar pekerjaan yang diurutkan yang perlu dilakukan sebelum layar pertama muncul. Karena sangat spesifik tentang tidak hanya apa yang perlu dilakukan, tetapi juga kapan pekerjaan tersebut harus dilakukan berdasarkan urutan, hal itu membatasi pengoptimalan susunan ulang dan penangguhan yang mungkin dilakukan.
Layar mulai
Jika App.OnStart berisi pemanggilan fungsi Navigate, bahkan jika itu berada di dalam fungsi If yang jarang dipanggil, aplikasi harus menyelesaikan eksekusi App.OnStart sebelum menampilkan layar pertama aplikasi.
App.StartScreen adalah cara deklaratif untuk menunjukkan layar mana yang harus ditampilkan terlebih dahulu, dan tidak memblokir pengoptimalan.
Mengatur StartScreen properti akan menampilkan layar pertama sebelum App.OnStart selesai.
App.StartScreen mendeklarasikan objek layar mana yang akan ditampilkan terlebih dahulu tanpa memerlukan praproses 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)
Informasi selengkapnya: App.StartScreen: alternatif deklaratif untuk Menavigasi di App.OnStart.
Peringatan
Hindari dependensi antara StartScreen dan OnStart. Mereferensikan rumus bernama yang pada gilirannya mereferensikan variabel global dapat menyebabkan ketentuan race yang StartScreen tidak diterapkan dengan benar.
Jangan membuat dependensi antara StartScreen dan OnStart. Meskipun aplikasi memblokir penggunaan variabel global di StartScreen, Anda dapat mereferensikan rumus bernama, yang kemudian mereferensikan variabel global. Pendekatan ini dapat menyebabkan kondisi lomba balap di mana StartScreen tidak diterapkan dengan benar.
Rumus bernama
Rumus yang diberi nama adalah rumus tetap atau konstanta yang dapat ditentukan dalam App.Formulas. Setelah dideklarasikan dalam App.Formulas, mereka dapat digunakan di mana saja di aplikasi, dan nilainya selalu tetap terbarui. Rumus bernama dalam Power Apps memungkinkan Anda menentukan nilai atau sekumpulan nilai yang dikelola dan diperbarui secara otomatis oleh platform. Fungsionalitas ini mengalihkan tanggung jawab perhitungan nilai dan upkeep dari pengembang ke Power Apps, menyederhanakan proses pengembangan. Rumus bernama dalam Power Apps adalah fitur canggih yang dapat secara signifikan meningkatkan performa dan keberlanjutan aplikasi.
Rumus bernama juga membantu saat mendeklarasikan tema aplikasi. Saat Anda membuat aplikasi perusahaan, Anda sering ingin aplikasi memiliki tema umum yang memberikan tampilan yang konsisten dan pengalaman pengguna. Untuk membuat tema, Anda perlu mendeklarasikan puluhan hingga ratusan variabel di App.OnStart. Deklarasi ini meningkatkan panjang kode dan waktu inisialisasi aplikasi.
Kontrol modern juga dapat secara signifikan membantu dalam penyesuaian tema dan mengurangi logika yang ditulis oleh pelanggan untuk menangani penyesuaian tema. Kontrol modern saat ini sedang dalam pratinjau.
Misalnya, Anda dapat memindahkan kode App.OnStart berikut ke App.Formulas, yang mengurangi waktu mulai 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");
Anda dapat memindahkan kode sebagai App.Formulas 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 dalam pengaturan Lookups. Di sini, perubahan diperlukan dalam rumus Lookup untuk mendapatkan informasi pengguna dari Office 365 alih-alih Dataverse. Anda hanya perlu membuat perubahan di satu tempat, 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 adaptasi diperluas untuk beralih dari tabel Pengguna Dataverse ke konektor Office 365 tanpa memerlukan perubahan pada rumus yang tersebar di seluruh aplikasi.
Pendekatan lain adalah mengoptimalkan countRows.
varListItems = CountRows(SampleList)
Dengan fungsi , Set Anda harus menginisialisasi variabel varListItems dengan jumlah awal baris dalam daftar sampel dan mengaturnya lagi setelah item daftar ditambahkan atau dihapus. Dengan formulasi bernama, saat data berubah, variabel varListItems diperbarui secara otomatis.
Rumus bernama dalam App.Formulas properti menyediakan pendekatan yang lebih fleksibel dan deklaratif untuk mengelola nilai dan perhitungan di seluruh aplikasi. Mereka menawarkan keuntungan dalam hal kemandirian waktu, pembaruan otomatis, keberlanjutan, dan definisi yang tidak dapat diubah dibandingkan dengan hanya mengandalkan App.OnStart.
| Aspek | Rumus bernama (App.Formulas) | App.OnStart |
|---|---|---|
| Kemandirian waktu | Rumus tersedia secara instan dan dapat dihitung dalam urutan apa pun. | Variabel mungkin 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 penemuan 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 Studio memungkinkan Anda membuat fungsi kustom Anda sendiri.
Tentukan rumus di bawah App.Formulas sebagai berikut:
FunctionName(Parameter1:DataType1, Parameter2:DataType2):OutputDataType = Formula
Kode berfungsi sebagai berikut:
FunctionNamememanggil fungsi .Parameteradalah nama input. Anda dapat menyertakan satu atau beberapa input.DataTypeadalah jenis data yang harus cocok dengan argumen yang diteruskan ke fungsi. Jenis data yang tersedia termasuk Boolean, Color, Date, Datetime, Dynamic, GUID, Hyperlink, Text, dan Time.OutputDataTypeadalah jenis data untuk output fungsi.Formulaadalah output fungsi.
Gunakan IfError untuk menerapkan penanganan kesalahan dalam fungsi yang ditentukan:
// Function to calculate the area of a circle based on the radius
calcAreaOfCircle(radius: Number): Number =
IfError(Pi() * radius * radius, 0);
Panggil fungsi yang ditentukan dari kontrol teks atau label.
calcAreaOfCircle(Int(*TextInput1*.Text))
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. Jaga agar Power App Anda tetap bersih dan terorganisir untuk performa 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 aplikasi Power Apps. Namun, koleksi dapat menyebabkan overhead performa. 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 pendekatan 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
ShowColumnsuntuk mendapatkan kolom tertentu saja. TambahkanFilterfungsi untuk hanya mendapatkan data yang relevan.Contoh fungsi berikut mengembalikan seluruh himpunan data:
ClearCollect(colDemoAccount, Accounts);Bandingkan fungsi 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:
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.
Meng-cache data pada 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
Untuk mengoptimalkan layar dan kontrol dalam Power Apps, pertimbangkan praktik terbaik berikut.
Hindari kontrol yang merujuk silang
Kontrol yang mereferensikan kontrol di layar lain dapat memperlambat pemuatan dan navigasi aplikasi. Pendekatan ini dapat memaksa aplikasi memuat layar lain daripada menunggu hingga pengguna masuk ke layar tersebut. Untuk mengatasi masalah ini, gunakan variabel, koleksi, dan konteks navigasi untuk berbagi status di seluruh layar.
Pemeriksa aplikasi di Power Apps Studio menampilkan kontrol yang direferensikan silang. Tinjau Pemeriksa Aplikasi secara teratur untuk memperbaiki masalah ini.
Dalam gambar berikut, kontrol Galeri 1 direferensikan silang di kontrol Layar 2, Label 2.
Jika Anda mereferensikan kontrol dari layar pertama dalam aplikasi ke layar kedua, tidak ada dampak penurunan kinerja karena layar pertama sudah dimuat. Perilaku ini sebenarnya bermanfaat karena aplikasi bersifat deklaratif alih-alih menggunakan variabel.
Jika Anda mereferensikan kontrol yang belum dimuat, seperti layar pertama yang merujuk 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. Penundaan ini berguna untuk menunda operasi mahal hingga pengguna selesai memasukkan teks, seperti pemfilteran saat input digunakan dalam rumus lain.
Misalnya, pertimbangkan galeri yang Itemnya difilter tergantung pada apa yang dimasukkan pengguna dalam kontrol TextInput:
Jika Anda mengatur DelayOutput ke false, yang merupakan default, galeri akan memfilter segera setelah teks apa pun ditik. Jika Anda memiliki galeri dengan banyak item, memuat ulang galeri dengan perubahan segera memperlambat performa. Lebih baik menunggu. Perilaku ini praktis saat Anda menggunakan
TextInputuntuk string pencarian atauStartsWithfungsi .Jika Anda mengatur DelayOutput ke true, ada penundaan singkat sebelum perubahan terdeteksi. Penundaan ini memberikan waktu untuk menyelesaikan pengetikan. Penundaan berfungsi dengan baik pada properti
TextInput.OnChange. Jika Anda memiliki tindakan terkait perubahan, Anda tidak ingin tindakan tersebut dipicu hingga Anda selesai mengetik di bidang.
Delegasi dan pemrosesan sisi server
Menggunakan delegasi dan pemrosesan sisi server memungkinkan aplikasi Anda menangani himpunan data besar secara efisien dengan membongkar operasi ke sumber data.
Delegasi
Delegasi dalam Power Apps mengacu pada kemampuan aplikasi untuk mendelegasikan operasi tertentu ke sumber data yang sesuai daripada memproses operasi tersebut di dalam Power Apps itu sendiri. Dengan menggunakan delegasi dalam Power Apps, Anda dapat membuat aplikasi yang lebih efisien dan dapat diskalakan yang berkinerja baik bahkan dalam skenario yang melibatkan himpunan data besar. Waspadai batasan delegasi untuk sumber data dan operasi tertentu, dan rancang aplikasi Anda sesuai untuk mencapai performa optimal.
Note
Tidak semua fungsi dapat didelegasikan. Pelajari selengkapnya tentang delegasi dalam Batasan kueri: Batas delegasi dan kueri.
Delegasi memiliki beberapa keuntungan, seperti pengoptimalan kueri dan dukungan untuk set data besar. Selain itu, jika data sumber sering berubah, delegasi membantu menjaga data tetap mutakhir.
Mengurangi panggilan API ke sumber data
Terkadang, membuat koleksi terasa praktis dengan melakukan penggabungan dalam aplikasi kanvas Anda. Pertimbangkan contoh berikut: Dalam contoh, ada dua tabel: Pengemudi dan Truk-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 real time, 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. Di dalam Dataverse, Anda dapat membuat plugin low-code untuk memproses data di server dan hanya mengembalikan hasil akhir ke aplikasi Canvas Anda.
Mendelegasikan pemrosesan data ke server dapat meningkatkan performa, mengurangi kode sisi klien, dan membuat aplikasi Anda lebih mudah dipelihara.
Pelajari lebih lanjut tentang plugin di Dataverse.
Mengoptimalkan pola data kueri
Mengoptimalkan bagaimana data kueri aplikasi Anda dapat secara signifikan mengurangi waktu muat dan meningkatkan responsivitas keseluruhan.
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 menghilangkan kolom jika tidak dapat menentukan bahwa kolom tersebut digunakan. Untuk memaksa ECS menyimpan kolom yang hilang, gunakan ekspresi Power Fx ShowColumns setelah referensi koleksi atau pada kontrol.
Hindari memanggil Power Automate untuk mengisi koleksi
Praktik umumnya adalah menggunakan Power Automate untuk mengambil dan mengisi koleksi dalam Power Apps. Meskipun pendekatan ini valid, ada situasi di mana itu mungkin bukan pilihan yang paling efisien. Memanggil Power Automate menambahkan latensi jaringan dan penurunan performa sebesar 0,6 detik untuk menginisiasi alur Power Automate.
Penggunaan alur Power Automate yang berlebihan juga dapat menyebabkan batas eksekusi dan pembatasan. Selalu evaluasi trade-off antara latensi jaringan dan biaya performa.
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. Masalah 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 rekaman terkait. Masalah biasanya terjadi ketika lebih banyak kueri dibuat untuk setiap item yang ditampilkan di galeri, yang menyebabkan hambatan kinerja.
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 RelatedDataSource ukurannya kecil (kurang dari 500 rekaman), cache dalam koleksi dan gunakan koleksi untuk mendorong skenario kueri Pencarian (N+1).
Batasi ukuran paket
Meskipun Power Apps mengoptimalkan pemuatan aplikasi, Anda dapat mengambil langkah-langkah untuk mengurangi jejak aplikasi Anda. Mengurangi jejak sangat penting bagi pengguna perangkat yang lebih lama atau pengguna di lokasi yang terdapat latensi yang lebih tinggi atau bandwidth yang berkurang.
Evaluasi media yang disematkan di aplikasi Anda. Jika ada sesuatu yang tidak digunakan, hapus.
Misalnya, gambar yang disematkan mungkin terlalu besar. Alih-alih file PNG, lihat apakah Anda dapat menggunakan gambar SVG. Berhati-hatilah menggunakan teks dalam gambar SVG karena font harus diinstal pada klien. Solusi sementara saat Anda perlu menampilkan teks adalah mengganti label teks di atas gambar.
Evaluasi apakah resolusi sudah sesuai dengan 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 memudahkan beberapa orang untuk mengerjakan aplikasi secara bersamaan, dan membatasi "radius ledakan" (jumlah pengujian) ketika perubahan aplikasi memerlukan lulus pengujian penuh.
Optimumkan ForAll
Fungsi ForAll dalam Power Apps digunakan untuk melakukan iterasi melalui tabel rekaman dan menerapkan rumus atau kumpulan rumus ke setiap rekaman. Meskipun fungsi itu sendiri serbaguna, penggunaan fungsi yang ForAll 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 rekaman pada satu waktu, mendapatkan hasilnya, dan kemudian berlanjut ke catatan berikutnya sampai melewati semua rekaman dalam cakupannya.
Hindari bersarang ForAll. Praktik ini dapat menyebabkan iterasi eksponensial dan secara signifikan memengaruhi performa.
ClearCollect(FollowUpMeetingAttendees.ForAll(ForAll(Distinct(AttendeesList.EmailAddress.Address).Lookup(Attendees))))
Memperbarui database secara batch
Anda dapat menggunakan ForAll dan Patch untuk batch memperbarui database. Namun, berhati-hatilah ketika Anda menggunakan urutan ForAll dan Patch.
Fungsi berikut adalah pendekatan yang lebih baik, misalnya:
Patch(SampleFoodSalesData, ForAll(colSampleFoodSales,
{
demoName:"fromCanvas2"
})
);
Sedangkan pendekatan berikut kurang efisien:
ForAll(colSampleFoodSales, Patch(SampleFoodSalesData,
{
demoName:"test"
})
);