Optimalizace výkonu: Datová vazba
Datová vazba WPF (Windows Presentation Foundation) poskytuje jednoduchý a konzistentní způsob, jak aplikace prezentovat data a pracovat s nimi. Prvky mohou být vázány na data z různých zdrojů dat ve formě objektů CLR a XML.
Toto téma poskytuje doporučení pro zlepšení výkonu datových vazeb.
Způsob řešení odkazů na datové vazby
Než probereme problémy s výkonem datových vazeb, je vhodné prozkoumat, jak modul datových vazeb WPF (Windows Presentation Foundation) řeší odkazy na objekty pro vazbu.
Zdrojem datové vazby WINDOWS Presentation Foundation (WPF) může být libovolný objekt CLR. Můžete vytvořit vazbu na vlastnosti, dílčí vlastnosti nebo indexery objektu CLR. Vazbové odkazy jsou vyřešeny pomocí reflexe rozhraní Microsoft .NET Framework nebo ICustomTypeDescriptor. Tady jsou tři metody pro vyřešení odkazů na objekty pro vázání.
První metoda zahrnuje použití reflexe. V tomto případě se objekt PropertyInfo používá ke zjišťování atributů vlastnosti a poskytuje přístup k metadatům vlastnosti. Při použití rozhraní ICustomTypeDescriptor používá modul datových vazeb toto rozhraní pro přístup k hodnotám vlastností. Rozhraní ICustomTypeDescriptor je zvlášť užitečné v případech, kdy objekt nemá statickou sadu vlastností.
Oznámení o změnách vlastností lze poskytovat buď implementací rozhraní INotifyPropertyChanged, nebo pomocí oznámení o změnách přidružených k TypeDescriptor. Upřednostňovanou strategií pro implementaci oznámení o změnách vlastností je však použití INotifyPropertyChanged.
Pokud je zdrojovým objektem objekt CLR a zdrojová vlastnost je vlastnost CLR, modul datových vazeb Windows Presentation Foundation (WPF) musí nejprve použít reflexi zdrojového objektu k získání TypeDescriptora následné dotazování na PropertyDescriptor. Tato posloupnost operací reflexe je z hlediska výkonu potenciálně velmi časově náročná.
Druhá metoda pro řešení odkazů na objekt zahrnuje CLR zdrojový objekt, který implementuje rozhraní INotifyPropertyChanged, a zdrojovou vlastnost, která je vlastností CLR. V tomto případě modul datových vazeb používá odraz přímo na zdrojovém typu a získá požadovanou vlastnost. To stále není optimální metoda, ale bude stát méně v pracovních nastavených požadavcích než první metoda.
Třetí metoda pro překlad odkazů na objekt zahrnuje zdrojový objekt, který je DependencyObject, a zdrojovou vlastnost, která je DependencyProperty. V tomto případě modul datových vazeb nemusí používat reflexi. Místo toho modul vlastností a modul datových vazeb společně přeloží odkaz na vlastnost nezávisle. Jedná se o optimální metodu pro vyřešení odkazů na objekty, které se používají pro datové připojení.
Následující tabulka porovnává rychlost databindingu vlastnosti Text u tisíce prvků TextBlock pomocí těchto tří metod.
Vázání vlastnosti Text pro TextBlock | čas vazby (ms) | doba vykreslování — včetně vázání (ms) |
---|---|---|
Na vlastnost objektu CLR | 115 | 314 |
Vlastnost objektu CLR, který implementuje INotifyPropertyChanged | 115 | 305 |
Na DependencyPropertyDependencyObject. | 90 | 263 |
Vazba na velké objekty CLR
Vytváření vazby dat k jednomu objektu CLR s tisícem vlastností má významný dopad na výkon. Tento dopad můžete minimalizovat rozdělením jednoho objektu na více objektů CLR s menším počtem vlastností. Tabulka zobrazuje časy vazby a vykreslování datových vazeb na jeden velký objekt CLR a více menších objektů.
Datové vazby 1000 TextBlock objektů | čas vazby (ms) | Doba vykreslování: zahrnuje připojení (ms) |
---|---|---|
Na objekt CLR s 1000 vlastnostmi | 950 | 1200 |
Až do 1000 objektů CLR s jednou vlastností | 115 | 314 |
Vazba na zdroj položek
Představte si scénář, ve kterém máte objekt CLR List<T>, který obsahuje seznam zaměstnanců, které chcete zobrazit v ListBox. Chcete-li vytvořit korespondenci mezi těmito dvěma objekty, vytvořte vazbu seznamu zaměstnanců na ItemsSource vlastnost ListBox. Předpokládejme ale, že se ke skupině připojíte nový zaměstnanec. Možná si myslíte, že chcete-li tuto novou osobu vložit do vašich svázaných hodnot ListBox, stačí tuto osobu přidat do seznamu zaměstnanců a očekávat, že tuto změnu datový vazebný engine automaticky rozpozná. Tento předpoklad by se ukázal jako nepravdivý; ve skutečnosti, ta změna se neodrazí v ListBox automaticky. Důvodem je to, že clr List<T> objekt automaticky nevyvolá změněnou událost kolekce. Aby ListBox zaregistrovalo změny, budete muset znovu vytvořit seznam zaměstnanců a znovu ho připojit k vlastnosti ItemsSource objektu ListBox. I když toto řešení funguje, přináší obrovský dopad na výkon. Pokaždé, když znovu přiřazujete ItemsSourceListBox novému objektu, ListBox nejprve vyhodí předchozí položky a znovu vygeneruje celý seznam. Dopad na výkon se zvětšuje, pokud se ListBox mapuje na komplexní DataTemplate.
Velmi efektivním řešením tohoto problému je vytvořit seznam zaměstnanců ObservableCollection<T>. Objekt ObservableCollection<T> vyvolá oznámení o změně, které může modul datových vazeb přijmout. Událost přidá nebo odebere položku z ItemsControl bez nutnosti znovu vygenerovat celý seznam.
Následující tabulka ukazuje dobu potřebnou k aktualizaci ListBox (s vypnutou virtualizací uživatelského rozhraní) při přidání jedné položky. Číslo v prvním řádku představuje uplynulý čas, kdy je objekt CLR List<T> vázán na ItemsSourceelementu ListBox . Číslo ve druhém řádku představuje uplynulý čas, kdy je ObservableCollection<T> vázán na ItemsSourceelementu ListBox . Všimněte si významných časových úspor pomocí strategie vazby dat ObservableCollection<T>.
Datová vazba pro ItemsSource | čas aktualizace pro 1 položku (ms) |
---|---|
Do objektu List<T> CLR | 1656 |
Do ObservableCollection<T> | 20 |
Vázejte IList k ItemsControl, ne k IEnumerable
Pokud máte na výběr mezi vazbou IList<T> nebo IEnumerable s objektem ItemsControl, zvolte objekt IList<T>. Vazba IEnumerable na ItemsControl nutí WPF vytvořit obalový objekt IList<T>, což znamená, že výkon je snížen zbytečnou režii druhého objektu.
Nepřeveďte objekty CLR na XML pouze pro datové vazby.
WPF umožňuje datovou vazbu k obsahu XML; datová vazba k obsahu XML je však pomalejší než datová vazba k objektům CLR. Nepřeveďte data objektu CLR na XML, pokud je jediným účelem datové vazby.
Viz také
- optimalizace výkonu aplikací WPF
- Plánování výkonu aplikací
- Využívání hardwaru
- rozložení a design
-
2D grafiky a obrazů - chování objektu
- prostředky aplikace
- Text
- dalších doporučení k výkonu
- Přehled datových vazeb
- Návod: Ukládání aplikačních dat do mezipaměti v aplikaci WPF
.NET Desktop feedback