Skocz do zawartości

Optymalizacja programu pod kątem wydajność i ”wielozadaniowości” jako praktyczne i konieczne zastosowanie


Mati294
Wiadomość dodana przez Treker,

Uwaga od redakcji!

Pamiętaj, że w dziale "Artykuły użytkowników" pojawiają się wpisy, które napisali czytelnicy Forbota. Każdy może opublikować tutaj swój poradnik (również Ty). Nie oceniamy i nie weryfikujemy tych treści przed publikacją - szczególnie, gdy dotyczą tematów związanych np. z prawem lub medycyną. Jeśli widzisz błąd merytoryczny to zgłoś go w komentarzach - kulturalna i merytoryczna krytyka jest zawsze mile widziana. Pamiętaj jednak o Polityce Przyjaznego Forum.

Pomocna odpowiedź

38 minut temu, _LM_ napisał:

lepiej wyniki wpisać w tablicę dwuwymiarową

No, ale tu chodzi o wykonanie akcji zależnej od wyniku, a to już nie jest takie proste. Owszem, możemy sobie zastosować tablicę funkcji, ale przy stosunkowo niewielkiej ilości przypadków w instrukcji switch nie robi to wielkiej różnicy (w przypadku Arduino każdy case to dwie instrukcje maszynowe). I może okazać się, że switch/case będzie szybszy niż zabawa z wywołaniem funkcji i powrotem.

 

Dnia 6.04.2021 o 19:50, Mati294 napisał:

Jeżeli już uświadomimy sobie że to bardziej skomplikowany projekt z zależnościami czasowymi musimy zapomnieć o używaniu delay(); na rzecz millis();

No, to baaaaaardzo duże uproszczenie.

Zawsze twierdziłem, że są trzy stopnie wtajemniczenia: na początku używa się delay(), potem rezygnuje się z delay() i używa millis(), a na końcu używa się tego co w danym miejscu jest właściwe 🙂

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Żeby nie być gołosłownym 😉 zakładam że FINGERPRINT_OK czy FINGERPRINT_IMAGEMESS.... itd są poukładane w kolejności o 0 wzwyż wtedy twój program mógłby wyglądać:

const char s1[] = "Str1"; // tab komunikatow
const char s2[] = "Str2";
const char s3[] = "Str3";

const char * const pStr[] = {s1,s2,s3}; // tab wskaznikow do komunikatow

p = finger.fingerFastSearch();
Serial.prinlnt(pStr[p]);
return p;

Gdyby polecenia nie były w kolejności należy je przemapować na indeksy znajdujące się w tablicy wskaźników tak samo należy zabepieczyć się przed wyjściem poza tę tablicę

Edytowano przez _LM_
Link do komentarza
Share on other sites

9 minut temu, ethanak napisał:

No, ale tu chodzi o wykonanie akcji zależnej od wyniku, a to już nie jest takie proste. Owszem, możemy sobie zastosować tablicę funkcji, ale przy stosunkowo niewielkiej ilości przypadków w instrukcji switch nie robi to wielkiej różnicy (w przypadku Arduino każdy case to dwie instrukcje maszynowe). I może okazać się, że switch/case będzie szybszy niż zabawa z wywołaniem funkcji i powrotem.

Owszem trzeba pilnować wskaźników i innych rzeczy aby nie wyszły poza rozmiar tablicy itd. Jednak przy wielu możliwościach wyboru rozwiązanie z tablicami wydaje się być bardziej przejrzyste. A jak już do wskaźników na napis masz dołożony wskaźnik na funkcję (oczywiście jeśli zachodzi taka potrzeba) to już w ogóle wypas 🙂 A czy różni się to wydajnościowo? hmmm przy większych programach na pewno. Poza tym zauważ że w załączonym przeze mnie pseudokodzie wykonuję tylko raz funkcję print co zaś przełoży się na rozmiar kodu.

Skoro post kolegi @Mati294 dotyczy pisania wydajnych programów sądzę iż zasadne jest pokazanie innych technik programowania

Edytowano przez _LM_
Link do komentarza
Share on other sites

23 minuty temu, _LM_ napisał:

wtedy twój program mógłby wyglądać:

Strasznie komplikujesz prostą sprawę.

A nie można po prostu:

const char * const pStr[]={"Str1", "Str2", "Str3"};

zamiast tworzenia niepotrzebnych zupełnie bytów, jak s1 i tak dalej? Takie konstrukcje są dobre jeśli używasz PROGMEM, ale wtedy masz kolejny galimatias z wydłubywaniem stringów z flasha i kombinowaniem, jak by tu je wypisać. Tam, gdzie sekcja stałych we flashu jest mapowana bezpośrednio do przestrzeni adresowej (np. ESP) wystarczy deklaracja const.

 

Link do komentarza
Share on other sites

30 minut temu, ethanak napisał:

Strasznie komplikujesz prostą sprawę.

A nie można po prostu:





const char * const pStr[]={"Str1", "Str2", "Str3"};

 

Co kto lubi 🙂 Powiedzmy że jest to kwestia nawyków i przyzwyczajeń, jako zaletę "mojego" rozwiązania mogę wymienić to że tworząc bardziej rozbudowane struktury, nie muszę liczyć pod którym indeksem znajduje się dany napis, a za to mogę odwołać się poprzez skróconą nazwę - wskaźnik. Oczywiście nie upieram się który zapis jest lepszy wszystko zależy co w danym momencie robimy

Edytowano przez _LM_
Link do komentarza
Share on other sites

Zacznę od tego że nie spodziewałem się takiego odzewu a teraz po kolei.

1 godzinę temu, ethanak napisał:

I może okazać się, że switch/case będzie szybszy niż zabawa z wywołaniem funkcji i powrotem.

Moim zdaniem instrukcja switch jest dużo bardziej czytelna a do przeważnie nie trzeba się zastanawiać co dana funkcja robi. W razie czego też zawsze można wyrzucić całość do innej karty. Wydaje się być też prostsza w debagu.

1 godzinę temu, ethanak napisał:

No, to baaaaaardzo duże uproszczenie.

Zawsze twierdziłem, że są trzy stopnie wtajemniczenia: na początku używa się delay(), potem rezygnuje się z delay() i używa millis(), a na końcu używa się tego co w danym miejscu jest właściwe

Tak w pełni się z tym zgadzam jednak z delay() (moim zdaniem) jest jak z goto bez prawdziwej potrzeby lepiej nie używać. Co do uproszczenia to wolałem je zastosować tak żeby początkujący mogli z tego skorzystać.

 

1 godzinę temu, _LM_ napisał:

A czy różni się to wydajnościowo? hmmm przy większych programach na pewno.

Przy większych programach (przynajmniej u mnie) większy problem stanowi wydajność a co do rozmiaru kodu no to niestety coś za coś.

Co do reszty jeżeli chodzi o fingerprint to aktualnie powstaje duuuużo bardziej zaawansowana wersja tego projektu gdzie sam czujnik i jego oprogramowanie stanowi tylko drobną cześć całości. Za jakiś czas powinien pojawić się osobny post dotyczącego tego projektu.

 

Link do komentarza
Share on other sites

33 minuty temu, Mati294 napisał:

Przy większych programach (przynajmniej u mnie) większy problem stanowi wydajność

Zatem chyba najwyższy czas poznać funkcje zwrotne wraz z timerami programowymi i przydzielaniem zadań. Nawet na małym AVR można zbudować aplikacje "wielowątkowe"

Link do komentarza
Share on other sites

3 minuty temu, _LM_ napisał:

Zatem chyba najwyższy czas poznać funkcje zwrotne wraz z timerami programowymi i przydzielaniem zadań. Nawet na małym AVR można zbudować aplikacje "wielowątkowe"

U mnie w większości odpowiada za to biblioteka do obsługi ekranu dotykowego jednak prędzej czy później będę musiał się tym zająć. Można prosić jakiś link do strony o tym z wykorzystaniem arduino?

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.