Bagikan melalui


Mengoptimalkan Performa: Pengikatan Data

Pengikatan data Windows Presentation Foundation (WPF) menyediakan cara sederhana dan konsisten bagi aplikasi untuk menyajikan dan berinteraksi dengan data. Elemen dapat terikat ke data dari berbagai sumber data dalam bentuk objek CLR dan XML.

Topik ini menyediakan rekomendasi performa pengikatan data.

Cara Penyelesaian Referensi Pengikatan Data

Sebelum membahas masalah performa pengikatan data, ada baiknya untuk mengeksplorasi bagaimana mesin pengikatan data Windows Presentation Foundation (WPF) menyelesaikan referensi objek untuk pengikatan.

Sumber pengikatan data Windows Presentation Foundation (WPF) dapat berupa objek CLR apa pun. Anda dapat mengikat ke properti, sub-properti, atau pengindeks dari objek CLR. Referensi pengikatan diselesaikan dengan menggunakan refleksi Microsoft .NET Framework atau ICustomTypeDescriptor. Berikut adalah tiga metode untuk menyelesaikan referensi objek untuk pengikatan.

Metode pertama melibatkan penggunaan pantulan. Dalam hal ini, objek PropertyInfo digunakan untuk menemukan atribut properti dan menyediakan akses ke metadata properti. Saat menggunakan antarmuka ICustomTypeDescriptor, mesin pengikatan data menggunakan antarmuka ini untuk mengakses nilai properti. Antarmuka ICustomTypeDescriptor sangat berguna dalam kasus di mana objek tidak memiliki sekumpulan properti statis.

Pemberitahuan perubahan properti dapat disediakan baik dengan menerapkan antarmuka INotifyPropertyChanged atau dengan menggunakan pemberitahuan perubahan yang terkait dengan TypeDescriptor. Namun, strategi yang disukai untuk menerapkan pemberitahuan perubahan properti adalah menggunakan INotifyPropertyChanged.

Jika objek sumber adalah objek CLR dan properti sumber adalah properti CLR, mesin pengikatan data Windows Presentation Foundation (WPF) harus terlebih dahulu menggunakan pantulan pada objek sumber untuk mendapatkan TypeDescriptor, lalu mengkueri untuk PropertyDescriptor. Urutan operasi refleksi ini berpotensi sangat memakan waktu dari perspektif performa.

Metode kedua untuk menyelesaikan referensi objek melibatkan objek sumber CLR yang mengimplementasikan antarmuka INotifyPropertyChanged, dan properti sumber yang merupakan properti CLR. Dalam hal ini, mesin pengikatan data menggunakan pantulan langsung pada jenis sumber dan mendapatkan properti yang diperlukan. Ini masih bukan metode optimal, tetapi akan lebih murah dalam persyaratan set kerja daripada metode pertama.

Metode ketiga untuk menyelesaikan referensi objek melibatkan objek sumber yang merupakan DependencyObject dan properti sumber yang merupakan DependencyProperty. Dalam hal ini, mesin pengikatan data tidak perlu menggunakan pantulan. Sebagai gantinya, mesin properti dan mesin pengikatan data bersama-sama menyelesaikan referensi properti secara independen. Ini adalah metode optimal untuk menyelesaikan referensi objek yang digunakan untuk pengikatan data.

Tabel di bawah ini membandingkan kecepatan data yang mengikat properti Text dari seribu elemen TextBlock menggunakan ketiga metode ini.

Mengikat properti Teks dari TextBlock Waktu pengikatan (ms) Waktu Render -- termasuk pengikatan (ms)
Ke properti objek CLR 115 314
Ke properti objek CLR yang mengimplementasikan INotifyPropertyChanged 115 305
Ke DependencyProperty dari DependencyObject. 90 263

Pengikatan ke Objek Besar CLR

Ada dampak performa yang signifikan saat Anda mengikat data ke satu objek CLR dengan ribuan properti. Anda dapat meminimalkan dampak ini dengan membagi objek tunggal menjadi beberapa objek CLR dengan lebih sedikit properti. Tabel memperlihatkan waktu pengikatan dan penyajian untuk pengikatan data ke satu objek CLR besar versus beberapa objek yang lebih kecil.

Pengikatan data untuk 1000 objek TextBlock Waktu pengikatan (ms) Waktu Render -- termasuk pengikatan (ms)
Ke objek CLR dengan 1000 properti 950 1.200
Hingga 1000 objek CLR dengan satu properti 115 314

Mengikat ke ItemsSource

Pertimbangkan skenario di mana Anda memiliki objek CLRList<T> yang menyimpan daftar karyawan yang ingin Anda tampilkan dalam ListBox. Untuk membuat korespondensi antara kedua objek ini, Anda akan mengikat daftar karyawan Anda ke properti ItemsSourceListBox. Namun, misalkan Anda memiliki karyawan baru yang bergabung dengan grup Anda. Anda mungkin berpikir bahwa untuk memasukkan orang baru ini ke dalam nilai ListBox terikat Anda, Anda cukup menambahkan orang ini ke daftar karyawan Anda dan mengharapkan perubahan ini dikenali oleh mesin pengikatan data secara otomatis. Asumsi itu akan terbukti palsu; dalam aktualitas, perubahan tidak akan tercermin dalam ListBox secara otomatis. Ini karena objek CLRList<T> tidak secara otomatis memicu peristiwa perubahan koleksi. Agar ListBox mengimplementasikan perubahan, Anda harus mengulang daftar karyawan Anda dan melampirkannya kembali ke properti ItemsSource dari ListBox. Meskipun solusi ini berfungsi, solusi ini memperkenalkan dampak performa yang besar. Setiap kali Anda menetapkan ulang ItemsSourceListBox ke objek baru, ListBox terlebih dahulu membuang item sebelumnya dan meregenerasi seluruh daftarnya. Dampak kinerja akan semakin besar jika ListBox Anda dipetakan ke DataTemplateyang kompleks.

Solusi yang sangat efisien untuk masalah ini adalah membuat daftar karyawan Anda ObservableCollection<T>. Objek ObservableCollection<T> memunculkan pemberitahuan perubahan yang dapat diterima mesin pengikatan data. Peristiwa menambahkan atau menghapus item dari ItemsControl tanpa perlu meregenerasi seluruh daftar.

Tabel di bawah ini menunjukkan waktu yang diperlukan untuk memperbarui ListBox (dengan virtualisasi UI dimatikan) saat satu item ditambahkan. Angka dalam baris pertama menunjukkan waktu yang berlalu ketika objek CLRList<T> terikat ke ListBoxelemen ItemsSource . Angka di baris kedua menunjukkan waktu yang berlalu ketika ObservableCollection<T> terikat ke elemen ListBoxItemsSource. Perhatikan penghematan waktu yang signifikan menggunakan strategi pengikatan data ObservableCollection<T>.

Pengikatan Data pada ItemsSource Waktu pembaruan untuk 1 item (md)
Ke objek CLRList<T> 1656
Ke ObservableCollection<T> 20

Ikat IList ke ItemsControl, bukan IEnumerable

Jika Anda memiliki pilihan antara mengikat IList<T> atau IEnumerable ke objek ItemsControl, pilih objek IList<T>. Mengikat IEnumerable ke ItemsControl mengharuskan WPF untuk membuat objek IList<T> pembungkus, yang berarti performa terpengaruh oleh biaya tambahan dari objek kedua yang tidak diperlukan.

Jangan Konversi objek CLR ke XML Hanya untuk Pengikatan Data.

WPF memungkinkan Anda untuk mengikat data ke konten XML; namun, pengikatan data ke konten XML lebih lambat daripada pengikatan data ke objek CLR. Jangan mengonversi CLR data objek ke XML jika satu-satunya tujuan adalah untuk pengikatan data.

Lihat juga