pajczur Temat założony przez niniejszego użytkownika |
Wydajność loopów, czas realizacji, obciążenie procesora, itp » 2018-03-07 22:49:51 Witam, mam kilka takich pytań naprawdę u podstaw :) założyłem dzisiaj na stackoverflow temat: https://stackoverflow.com/questions/49159448/push-back-vectors-values-into-vector-for-loop-cpu-load Ale nikt mi jeszcze nie odpowiedział, a ja się strasznie niecierpliwię :) więc pytam dodatkowo tutaj.
Zastanawiam się jak działają loopy. Np. czy da się jakoś obliczyć, czy to w ogóle ma sens, ile czasu zajmuje procesorowi wykonanie jednej iteracji najprostrzego loopa, np:
int a; for (int i=0; i<100; i++) { a=i; }
I jakie to jest obciążenie dla procesora? zastanawiam się, gdyż trochę się bawię w programowanie audio. A tam loopy mają po kilkadziesiąt tysięcy iteracji. Np. 44100, a w każdej z tych iteracji mogą być inne duże loopy, a w każdej iteracji tych wewnętrznych loopów czasami dzieją się skomplikowane obliczenia, jak np. na liczbach zespolonych przy obliczaniu FFT.
Jak sprawdzić, lub zoptymalizować wydajność takich loopów?
Jakiś czas temu również gadałem z jakimś profesorem od C++ i on mi doradził aby każde zadanie w aplikacji rozbijać na oddzielne funkcje lub nawet klasy. A ja jakoś oprócz przejrzystości w kodzie, nie rozumiem takiego podejścia. Bo np. kiedy chcę wykonać obliczenia DFT, a potem narysować wyniki na ekranie w postaci wykresu, to z tego co mówił Pan profesor powinienem zrobić przynajmniej dwie funkcje, jedną do liczenia DFT, a drugą do rysowania. Ale przecież aby narysować każdy punkt takiej transformaty fouriera to też muszę wykonać loopa. Czyli będę miał loopa w funkcji liczącej DFT, a potem drugiego loopa w funkcji rysującej. A czy dla wydajności mojego programu nie byłoby lepiej abym wykorzystał loopa DFT i w nim jednocześnie wykonał rysowanie? Wtedy przecież program ma do wykonania jednego loopa.
Nie wiem jak to wszystko ugryźć.
Albo inne pytanie, jeżeli potrzebują w loopie jakiejś zmiennej pomocniczej, to lepiej ją utworzyć poza loopem i w loopie tylko przypisywać dla tej zmiennej jakaś wartość? Np. std::vector<int> _a; int pomocnicza1; int pomocnicza2; for (int i=0; i<100; i++) { pomocnicza1 = 2 * i; pomocnicza2 = 4 * i; _a.push_back(pomocnicza1 + pomocnicza2); }
Czy może lepiej w każdej iteracji tworzyć liczy pomocnicze, czyli: for (int i=0; i<100; i++) { int pomocnicza1 = 2 * i; int pomocnicza2 = 4 * i; _a.push_back(pomocnicza1 + pomocnicza2); }
A może jeszcze lepiej byłoby: for (int i=0; i<100; i++) { _a.push_back(2 * i + 4 * i); }
Co jest najlepsze dla wydajności. I jak w przyszłości sprawdzać odpowiedzi na podobne pytania?
Z góry wielkie dzięki za wszelką pomoc. |
|
pekfos |
» 2018-03-08 00:03:45 Czy może lepiej w każdej iteracji tworzyć liczy pomocnicze, czyli:
for( int i = 0; i < 100; i++ ) { int pomocnicza1 = 2 * i; int pomocnicza2 = 4 * i; _a.push_back( pomocnicza1 + pomocnicza2 ); } |
To. A może jeszcze lepiej byłoby:
for( int i = 0; i < 100; i++ ) { _a.push_back( 2 * i + 4 * i ); } |
Byłoby. Co jest najlepsze dla wydajności. |
Żadne z powyższego nie ma znaczenia. Bo np. kiedy chcę wykonać obliczenia DFT, a potem narysować wyniki na ekranie w postaci wykresu, to z tego co mówił Pan profesor powinienem zrobić przynajmniej dwie funkcje, jedną do liczenia DFT, a drugą do rysowania. Ale przecież aby narysować każdy punkt takiej transformaty fouriera to też muszę wykonać loopa. |
I będziesz liczyć DFT za każdym razem, kiedy potrzebujesz je wyświetlić? Bo przecież potrzebujesz więcej niż raz. Po co dokładnie chcesz optymalizować program w skali mikro, skoro zapewne tracisz dużo wydajności w skali makro..? Wtedy przecież program ma do wykonania jednego loopa. |
Ilość kodu nie ma żadnego przełożenia na wydajność. Dwie pętle mogą w niektórych przypadkach działać szybciej niż jedna pętla, która wykonuje te same operacje. PS: Sformatuj post. |
|
pajczur Temat założony przez niniejszego użytkownika |
» 2018-03-08 01:09:21 Hej, wielkie dzięki za odpowiedź. Ja odpowiem może w punktach: 1) bardzo chciałbym sformatować posta, tak aby kod wyglądał jak kod, a cytaty jak cytaty, jednak ja tu nie widzę, żadnych opcji formatowania, chetnie bym screena wrzucił aby pokazać jak wygląda u mnie panel wpisywania tej wiadomości, ale nawet nie ma opcji żadnej. Może coś trzeba włączyć, proszę o podpowiedź.
2) napisałeś: "I będziesz liczyć DFT za każdym razem, kiedy potrzebujesz je wyświetlić?" obliczenie DFT wykonują się u mnie w czasie rzeczywistym, a dokładniej co sekundę pobiera próbkę o długości 44100 i jak tylko uzbiera taką ilość, to wykonuje obliczenia. Docelowo oczywiście mają to być obliczenia FFT, ale to temat na innego posta. W każdym razie bardzo mnie interesuje to co napisałeś o optymalizacji w skali makro i mikro. Nie mam zielonego pojęcia o czym mowa, ale czuję, że to coś ważnego. Wydaje mi się, że mikro, masz na myśli właśnie pierdoły typu, czy deklarować zmienną w loopie, czy poza loopem itp. Ale nie jestem pewien czy to miałeś na myśli, bo skoro podane przeze mnie sposoby zapisania loopa nie mają znaczenie, to przecież to nie jest żadna optymalizacja, nawet mikro? Czy mógłbyś rozwinąć ten wątek? Byłbym ogromnie wdzięczny. Dopiero się uczę i bardzo chętnie wchłaniam wszystkie informacje. Tak samo sprawa się ma z optymalizacją makro. Napisałeś, że "...zapewne tracisz dużo wydajności w skali makro...". Czy chodzi Ci o to właśnie, że robię obliczenia DFT zamiast FFT? Czy może o jakieś inne aspekty?
3) no i wciąż ciekawi mnie czas wykonywania loopów. Ile komputer potrzebuje czasu aby wykonać jakiś loop i jego poszczególne iteracje. A także ile to pochłania energii procesora. To chyba ma znaczenie? Bo gdyby nie miało znaczenia to chyba nie byłoby sensu implementować algorytmu FFT, bo DFT wykonałby się tak samo sprawnie jak FFT. A przecież wiemy, że tak nie jest, dlatego to są dla mnie ważne pytania. O co w tym kaman? :)
Jeszcze raz dzięki za pomoc. |
|
pekfos |
» 2018-03-08 01:51:54 jednak ja tu nie widzę, żadnych opcji formatowania, chetnie bym screena wrzucił aby pokazać jak wygląda u mnie panel wpisywania tej wiadomości, ale nawet nie ma opcji żadnej. Może coś trzeba włączyć, proszę o podpowiedź. |
Trzeba włączyć oczy i otworzyć umysł. Jak widzisz czerwoną ramkę, należy się z nią zapoznać. Wydaje mi się, że mikro, masz na myśli właśnie pierdoły typu, czy deklarować zmienną w loopie, czy poza loopem itp. Ale nie jestem pewien czy to miałeś na myśli, bo skoro podane przeze mnie sposoby zapisania loopa nie mają znaczenie, to przecież to nie jest żadna optymalizacja, nawet mikro? |
C++ to wygodna abstrakcja do pisania kodu maszynowego. Jak chcesz wiedzieć co ma znaczenie, a co nie, czytaj kod maszynowy. To to ostatecznie wpływa na wydajność, nie to jak to dokładnie zapiszesz w C++, więc przede wszystkim pisz kod czytelnie, a nie możliwie bardzo optymalnie. Jeśli nie wiesz dokładnie co robisz i jaki dokładnie chcesz wywrzeć efekt w generowanym kodzie, to i tak nic nie osiągniesz. Tak samo sprawa się ma z optymalizacją makro. Napisałeś, że "...zapewne tracisz dużo wydajności w skali makro...". Czy chodzi Ci o to właśnie, że robię obliczenia DFT zamiast FFT? Czy może o jakieś inne aspekty? |
Chodziło o to, że zasadniczo wyświetlanie odbywa się wiele razy w ciągu sekundy. Może to nie być dokładnie tak w bibliotece której używasz, ale jeśli jest, to liczyłbyś DFT wiele razy na tych samych danych. To się też odnosi do wielu innych rzeczy, które tak naprawdę powinieneś optymalizować. Jak algorytm wykonuje się za długo, to pewnie algorytm jest nieoptymalny, a nie pętla sama w sobie - elementarny klocek z którego i tak nie zrezygnujesz. no i wciąż ciekawi mnie czas wykonywania loopów. Ile komputer potrzebuje czasu aby wykonać jakiś loop i jego poszczególne iteracje. |
To nie jest pytanie, na które da się tak odpowiedzieć. A także ile to pochłania energii procesora. |
A co to jest energia procesora? |
|
pajczur Temat założony przez niniejszego użytkownika |
» 2018-03-09 15:54:44 "A co to jest energia procesora?" |
To nie wiedziałeś !!! ??? To jest takie coś, że się robi ciepły. :) A tak poważnie to dzięki za pomoc. |
|
« 1 » |