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
Podejście nr 2: użycie struktury in place, bezpośrednio - bez funkcji, zał. 2 "in place" czas wykonania 121 ms
Podejście nr 3: brak optymalizacji, odwołanie do funkcji reentrant (bez obsługi błędów), zał.3 "reentrant" czas wykonania 531 ms
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
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.
Optymalizacja: Reference Data Value, In Place, Inline
Optymalizacja: Reference Data Value, In Place, Inline
- Załączniki
-
- Root Test.rar
- (55.46 KiB) Pobrany 295 razy
- cyjan1
- Posty: 70
- Rejestracja: 08 paź 2012 11:55
- Wersja środowiska: LabVIEW 2017
- Lokalizacja: podkarpacie
Re: Optymalizacja: Reference Data Value, In Place, Inline
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:
oraz 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
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:
oraz 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
Zenek
Optymalizacja: Reference Data Value, In Place, Inline
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.