Optymalizacja: Reference Data Value, In Place, Inline

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
Awatar użytkownika
Brad PID
Posty: 29
Rejestracja: 24 kwie 2013 01:12
Wersja środowiska: LabVIEW 2012

Optymalizacja: Reference Data Value, In Place, Inline

Post autor: Brad PID »

Cześć,

Post może być trochę dłuższy więc zacznę od ogółu. Muszę zoptymalizować funkcję która może się wykonać nawet kilka milionów razy i musi zrobić to szybko. Główny problem polega na tym,że chciałbym aby funkcja wykonywała się bez alokacji wielkiego buffora z ogromną tablicą za każdym razem kiedy się do niej odwołuje.

A teraz kilka szczegółów. Funkcja o której mówię to algorytm Quick Union. Nie jestem informatykiem z wykształcenia ale po ilości informacji na ten temat wnioskuje, że może to być jakiś klasyk informatyki.

Przygotowałem krótkie demko na którym wykonuje operację "root" lub "find" w zależności od nomenklatury na kilka różnych sposobów. Wykorzystuje dwa rodzaje algorytmu: z kompresją i bez kompresji drzewa. Z kompresją działa szybciej więc moje próby optymalizacji skupiły się na tej wersji algorytmu.

Moje wyniki: ( głębokość drzewa: 50, ilość wykonań funkcji 5 000 000)
Podejście nr 1: brak optymalizacji,bezpośrednio - bez funkcji, zał. 1 "brak optymalizacji" czas wykonania 111 ms
brak optymalizacji.png
brak optymalizacji.png (24.64 KiB) Przejrzano 5165 razy
Podejście nr 2: użycie struktury in place, bezpośrednio - bez funkcji, zał. 2 "in place" czas wykonania 121 ms
in place.png
in place.png (25.88 KiB) Przejrzano 5165 razy
Podejście nr 3: brak optymalizacji, odwołanie do funkcji reentrant (bez obsługi błędów), zał.3 "reentrant" czas wykonania 531 ms
reentrant.png
reentrant.png (21.03 KiB) Przejrzano 5165 razy
Podejście nr 4: brak optymalizacji, odwołanie do funkcji inline, (wygląd funkcji taki sam jak powyższej tylko ustawienie są na inline) czas wykonania 89 ms
Podejście nr 5: użycie Reference Data Value i struktury in place, odwołanie do funkcji reentrant, zał4. "RDV", czas wykonania 2077 ms
RDV.png
RDV.png (24.62 KiB) Przejrzano 5165 razy
Moje wyniki są całkowicie inne od tych jakie bym oczekiwał. Moje pytania:
1. Z tego co rozumiem ustawiając funkcje jako inline, wstawiamy ją w kod tak jak makra wstawia się w tekstowych językach programowania przez co nie tracimy czasu na odwoływanie się do niej i przekazywanie argumentów. Mam racje? Dlaczego algorytm z funkcją inline chodzi szybciej od tego samego algorytmu bez zastosowania funkcji. Wydaje mi się że powinien wykonywać się porównywalnie, a on jest szybszy. Dlaczego?
2.
Dlaczego pomimo, że wybrałem funkcję inline, nadal widzę ( po wybraniu narzędzia profile>> show buffer allocation) alokację bufora na kontrolce wejściowej do funkcji? Jak mogę się tego pozbyć?
3. Jaki jest sens używania funkcji, która przekazuje argument poprzez RDV, a później i tak w strukturze in place jest ona wartość jest na nowo alokowana ( narzędzie show buffer...)


W załączniku wrzucam dodatkow demko w którym można przesymulować to co tu napisałem. Gratuluję wszystkim, którzy dotatarli do tego miejsca czytając ;) i mam nadzieje, że ktoś mi pomoże.
Załączniki
Root Test.rar
(55.46 KiB) Pobrany 295 razy
Dawid Woźny
Certified LabVIEW Associate Developer
www.optinav.pl
Obrazek
Awatar użytkownika
cyjan1
Posty: 70
Rejestracja: 08 paź 2012 11:55
Wersja środowiska: LabVIEW 2017
Lokalizacja: podkarpacie

Re: Optymalizacja: Reference Data Value, In Place, Inline

Post autor: cyjan1 »

Witam!

Niech mnie ktoś poprawi jeśli się mylę, ale wg mnie poprawne użycie In Place Sturcture oraz Data Value References powinno wyglądać w tym przypadku tak:
in place.png
in place.png (23.12 KiB) Przejrzano 5095 razy
oraz
RDV.png
RDV.png (22.75 KiB) Przejrzano 5095 razy
Czyli najważniejsza sprawa: In Place Structure jest wykorzystywane do manipulowania na dużych tablicach (w tym przypadku Replace Array Subset) bez kopiowania całej tablicy.
Twoje użycie In Place Structure (z użyciem wejść In, Out) tak naprawdę nic nie robiło (o ile nawet nie spowalniało lekko programu).

Spróbuj przetestować moje przykłady (niestety mam tylko LV2009).

Pozdrawiam
Zenek
Pozdrawiam
Zenek
Awatar użytkownika
Brad PID
Posty: 29
Rejestracja: 24 kwie 2013 01:12
Wersja środowiska: LabVIEW 2012

Optymalizacja: Reference Data Value, In Place, Inline

Post autor: Brad PID »

Funkcja z poprawnie zaimplementowaną strukturą In Place wykonuje się podobnie szybko jak wersja bez. Doczytałem, że labview kiedy tylko może to optymalizuje kod i podczas użycia rejestrów przesuwnych wstawia samemu "in place" podczas kompilacji. Więc w takim wypadku to że wstawiłem ją ręcznie może co najwyżej spowolnić. Kod który wykonywał się w głównym menu był wolniejszy od funkcji In Line ponieważ nie wyłączyłem debugowania. Dalej jednak zastanawia mnie użycie RDV, gdyż jest ono ciągle nieporównywalnie wolniejsze (nawet jak testowałem twoją wersję). Wygląda na to, że dalej bufor jest alokowany i przez to takie opóźnienie. Trochę nie bardzo zgadza mi się to z ideą RDV.
Dawid Woźny
Certified LabVIEW Associate Developer
www.optinav.pl
Obrazek
ODPOWIEDZ