Optymalizacja aplikacji

0

Witajcie,

Pytanie jak w temacie moi drodzy - jak optymalizujecie swoje aplikacje/programy bądź większe, solidniejsze oprogramowania z dostępem do wielu sesji i tablic? Na każdym smartfonie możemy wyszczególnić w ustawieniach sesję "Optymalizuj" - jak Wy to widzicie w programach Desktopowych?

Dziękuję i pozdrowienia !

2

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 ;-)

3

Ale co sesje i tablice mają do optymalności aplikacji?

Gdy stwierdzam, że aplikacja jest niewydajna, to mierzę co się w niej dzieje (profilerem), a potem poprawiam.
Poprawką może być np. batchowanie operacji na bazie, wyłączenie śledzenia obiektów przez ORM, pozbycie się LINQ, zkeszowanie czegoś (wiele problemów potrafi rozwiązać zwykłe umieszczenie w polu statycznym).

3

Pierwsza i podstawowa sprawa to mierzenie.
Druga i podstawowa rzecz to mierzenie.
Trzecia sprawa to mierzenie.
Czwarta sprawa to mierzenie.

Czyli logujemy, testujemy pod obciążeniem, profilujemy, żeby wiedzieć co ile kosztuje, gdzie są wąskie gardła które warto optymalizować, i widzieć jaki zysk przyszedł z naszych optymalizacji by móc ocenić czy warto ją zachować, czy może lepiej pozostawić bardziej czytelny kod.

0

Panowie - bardzo dziękuję za odpowiedzi, zacznę od początku:

@grzesiek51114 - jak najbardziej używam programowania asynchronicznego definiując async i await - do każdej funkcji czy też algorytmu bardziej złożone, gdzie wykorzystywanych jest więcej mocy obliczeniowych stosuję całkiem osobnego Task'a więc tym sposobem GUI nie jest blokowane, bo uzyskuję wielowątkowość i następuję odciążenie wątku głównego aplikacji.
Z Dispatcher'a jeszcze nie korzystałem - dziś dokładnie zaznajomię w praktyce.
Co do Grid'a i danych z tablicy - jak najbardziej używam definicji wczytania najpierw pojedynczych rekordów, gdzie słowo "pojedynczych" zawieram w cudzysłowie - bo wlatuje na początek koło 200 item'ów i logicznym rzecz biorąc do tego również ładuję całość z Task'a.
VirtualizingStackPanel - również nie korzystałem, zastosuję w celach testowych i zdam sprawozdanie. O rozmiarówce również słyszałem. Polecane jak najbardziej.

@somekind - mając na myśli sesję do optymalizacji - czyli stworzenie całkiem odrębnej sesji w aplikacji, która dokona optymalizacji obecnego oprogramowania poprzez przykładowe zwalnianie pamięci, czyszczenie plików po kompilatorze, czyszczenie systemowej pamięci podręcznej i wiele innych - pytam o wszelkie możliwości. O samej optymalizacji kodu chłopaki wyżej dobrze piszą jak najbardziej.

@neves - sesje, które są 'krótkie' i nie nadają się do programowania asynchronicznego odpuszczamy, są tak małe, że nie potrzeba optymalizacji, ale sesja gdzie samo ładowanie danych z tablicy zajmuje troszkę czasu, albo aplikacja z szyfrowaniem całych katalogów lub dysku to proces długotrwały i pytam również właśnie o takie sesje.

1

Z Dispatcher'a jeszcze nie korzystałem - dziś dokładnie zaznajomię w praktyce.

To taki starszy sposób z okresu kiedy możliwości wykorzystania await i async jeszcze nie było, aczkolwiek ma swoje zalety.

...poprzez przykładowe zwalnianie pamięci

Nie wiem co tutaj masz na myśli ale mam nadzieję, że nie GC.Collect(). Jeżeli chodzi o dobre zarządzanie zasobami to warto np. using'ować to co dziedziczy po IDisposable czy odsubskrybować eventy żeby nie było wycieków pamięci vide np. eventAggregator z Prisma. W żadnym wypadku nie ma potrzeby ręcznego zarządzania pamięcią.

PS: ...ponieważ w C# rzecz jasna istnieje zjawisko wycieku pamięci.
https://stackoverflow.com/questions/4526829/why-and-how-to-avoid-event-handler-memory-leaks

0

Podasz przykład funkcji pod eventAggregator ?
GC.Collect() - broń Cię Panie Boże, kompletnie tego nie mam na myśli, bardziej poprawnym terminem jest zarządzanie zasobami co też miałem na myśli.

0

Żeby zrozumieć EventAggregator musisz poczytać o jakichś frameworkach MVVM np. Prism czy MVVM Light, który ma coś podobnego tylko tam nazywa się to bodajże Messenger. Oba działają na zasadzie wzorca obserwatora.

0

Oczywiście, jeszcze dziś się zacznę zaznajamiać, interesująco wygląda opis merytoryczny, bo już właśnie przeglądam, czas wejść na poziom wyższy i zrozumieć oraz zastosować.

A pod serwer proxy jakieś wskazówki ? Przykładowo - implementacja proxy pod własne potrzeby.

0
Forik napisał(a):

@somekind - mając na myśli sesję do optymalizacji - czyli stworzenie całkiem odrębnej sesji w aplikacji, która dokona optymalizacji obecnego oprogramowania poprzez przykładowe zwalnianie pamięci, czyszczenie plików po kompilatorze, czyszczenie systemowej pamięci podręcznej i wiele innych - pytam o wszelkie możliwości. O samej optymalizacji kodu chłopaki wyżej dobrze piszą jak najbardziej.

To może od początku - co Ty właściwie nazywasz sesją w aplikacji?
Jaki związek ma aplikacja z "plikami po kompilatorze" i co do wydajności aplikacji ma systemowy cache?

0

@somekind: Przykład dla lepszego zrozumienia - Szyfrowanie plików AES - to jedna sesja, natomiast drugą jest deszyfrowanie pliku, który został zaszyfrowany, inny przykład to konwerter pliku - jedna sesja wykonuje konwertowanie pliku do poziomu rozszerzenia .csv - inna (druga) sesja wykonuje ten proces na pliku do rozszerzenia .pdf

Sesja = funkcjonalność - w skład sesji mogą wchodzić formy, kontrolki, funkcje, tablice jako zbiór danych.

Po prostu ja takiego terminu używam, gdyż sam pracuję na co dzień z systemem ERP tworząc i rozwijając (to mocne słowa :P), gdzie odrębne procesy z wykonywaniem algorytmu nazywamy sesjami.

1

"Zoptymalizuj funkcję f(x)=sin(x)" (albo "zoptymalizuj aplikację"), co to znaczy? :)

Jak dla mnie każda optymalizacja wiąże się, ze znajomością kryteriów względem których optymalizujemy. Bez tego, to w zasadzie co jest przedmiotem optymalizacji i na jakiej podstawie twierdzimy, że "jest lepiej"/"optymalnie" i już dalej nie optymalizujemy (kryterium stopu) ? Zużycie zasobów, czas odpowiedzi, saturacja zasobu, czas developmentu aplikacji, zużycie energii elektrycznej?

Jak znam kryteria, to jak napisał @neves, mierzymy i jeszcze raz mierzymy. Zbieramy "baseline" (coś do czego będziemy porównywać efekt "zmian optymalizacyjnych"), wprowadzamy zmiany i znów mierzymy.

0

Ok, dziękuję za odpowiedzi - dlatego właśnie napisałem dość nieodpowiednio swoje zapytanie, aby wywołać burzę mózgów i wyłowić pomysły, idee i pogląd innych programistów. :)

0
Forik napisał(a):

@somekind: Przykład dla lepszego zrozumienia - Szyfrowanie plików AES - to jedna sesja, natomiast drugą jest deszyfrowanie pliku, który został zaszyfrowany, inny przykład to konwerter pliku - jedna sesja wykonuje konwertowanie pliku do poziomu rozszerzenia .csv - inna (druga) sesja wykonuje ten proces na pliku do rozszerzenia .pdf

Sesja = funkcjonalność - w skład sesji mogą wchodzić formy, kontrolki, funkcje, tablice jako zbiór danych.

Ok, czyli Ty sesją nazywasz ogół kodu programu związany z wykonaniem jakiejś transakcji biznesowej/przypadku użycia. Tak na ogół, to sesja się raczej z czym innym kojarzy.
Generalnie, to o ile się pamięta o podstawowej higienie w kodzie, czyli: zwalnianiu zasobów Disposable, niealkokowaniu obiektów niepotrzebnie, i o mądrym korzystaniu z ORM, i nadal narzekamy na wydajność, to zostaje tylko mierzenie i hakowanie.

0

Ok, dziękuję Ci bardzo.

A wskazówki odnośnie serwera proxy?

0

Co wg cb oznacza serwer proxy? Może znów coś innego jak z sesją? :D

0

Słuszne pytanie. HTTP Proxy? Coś takiego jak Squid?

0

Coś takiego jak Squid.

0
Bogaty Ogórek napisał(a):

Co wg cb oznacza serwer proxy? Może znów coś innego jak z sesją? :D

Nie rozumiem co śmiesznego jest w wyrazie sesja. Jak definiujesz słowo pojazd? Twoja definicja może się różnić słownie i merytorycznie od mojej - a znaczenie finalne będzie podobne - i z tego powodu też będziesz się śmiać?

1

A masz już w ogóle cokolwiek zrobione? Generalnie zasada działania jest prosta:

  1. bierzesz pakiet IP,
  2. patrzysz na source i destination,
  3. dekapsułujesz pakiet żeby wyciągnąć dane o HTTP,
  4. sprawdzasz czy w/w dane zgadzają się z regułami ruchu np. blokować czy puścić jeżeli link zawiera to czy tamto,
  5. logujesz akcje,
  6. routujesz pakiet, w zależności od reguły: w kosmos lub do source z jakimś np. komunikatem HTTP jeśli blokujesz, w kierunku destination jeżeli puszczasz,
  7. ...lub w ogóle tylko routujesz pakiet jeżeli proxy ma jedynie logować ruch.

Szczegółów implementacji takich rzeczy nie znam ale myślę, że jakimiś network streamami z .neta można byłoby to ogonić.
No i jeżeli to ma być transparent proxy to komputery mogą w ogóle nie wiedzieć o jego istnieniu, a jego samego trzeba postawić gdzieś pomiędzy bramą, a resztą sieci. Zresztą proxy to pojęcie bardzo ogólne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1