Pierwsza i podstawowa sprawa to asynchroniczność zadań żeby nie blokować GUI. Jeżeli ciągniesz z bazy zwartość tabelki to niech to robi osobny Task
pod spodem, a GUI zaktualizuje się w locie kiedy dane zostaną pobrane. Można to osiągnąć np. poprzez async
i await
albo stosująć ThreadPool.QueueUserWorkItem
wespół z Dispatcher'em
.
Druga i podstawowa rzecz to stronicowanie danych czyli zamiast ładować do grida całość tabeli trzeba podzielić ją na strony i załadować np. pierwsze 50 rekordów. Oczywiście stosując się do punktu pierwszego.
Trzecia sprawa to, w przypadku WPF'a, wirtualizacja kontrolek, by nie wyświetlały danych, które i tak "na tę chwilę" są dla usera niewidoczne. Niby to kuriozum ale wirtualizacji można się niechcący bardzo łatwo pozbyć np. wsadzając DataGrid'a
do ScrollViewer'a
. Dodatkowo zalecane jest stosowanie np. VirtualizingStackPanel
i kilka innych, podobnych "sztuczek". Przy bindowaniu kolekcji danych przydaje się również opcja IsAsync=True
.
Czwarta sprawa to, w przypadku WPF'a i tworzenia własnych UserControls
, ustalenie tzw. fixed size niektórych komponentów by aplikacja miała jak najmniej do liczenia podczas renderowania GUI. Czytałem też wielokrotnie, że stosowanie rozmiarówki auto
także wpływa negatywnie na wydajność.
To takie podstawowe, które robię. Więcej to musiałbym się zastanowić ale coś by się znalazło, chociaż wiadomo wszem i wobec, że jeżeli naskrobiesz marne zapytanie do bazy vide np. n+1 select
z ORM'a to żadna optymalizacja warstwy GUI nie pomoże ;-)