Witam,
mam kilka takich pytań naprawdę u podstaw :)
założyłem wczoraj wątek na stackoverflow.
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.