• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Co kompilator za mnie zrobi a o co sam mam się martwić?

Object Storage Arubacloud
+1 głos
243 wizyt
pytanie zadane 25 sierpnia 2022 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
Kompilator optymalizuje program lepiej niż programista podobno, ale i tak słyszałem że są kody które działają szybciej i takie które działają wolniej. Podczas pisania programu na co mam głównie zwracać uwagę aby dbać o wydajność? Złożoność obliczeniową i pamięciową? Wskaźniki i referencje? Sposób alokacji pamięci?

Przykładowo, lepiej zrobić kilka else ifów z małą ilością warunków czy jeden ogromny if w którym jest wiele warunków? Czy kompilator za mnie wybierze lepszą opcje? W każdym przypadku?

1 odpowiedź

+2 głosów
odpowiedź 25 sierpnia 2022 przez j23 Mędrzec (194,920 p.)
wybrane 26 sierpnia 2022 przez Daaa22
 
Najlepsza

Złożoność obliczeniową i pamięciową?

To pierwsze, jeśli zależy Ci na szybkości, to drugie - jeśli piszesz na platformy z mocno ograniczonymi zasobami. Najlepiej pamiętać o obu kwestiach.

Wskaźniki i referencje?

Na jedno wychodzi, więc to rozróżnienie niewiele zmienia. W C++ powinieneś ograniczać użycie gołych wskaźników na rzecz referencji, ale nie ze względu na wydajność co potencjalne błędy.

Lepiej zrobić kilka else ifów z małą ilością warunków czy jeden ogromny if w którym jest wiele warunków?

Poczytaj o short-circuit evaluation. Czasem jeden wielki warunek jest wydajniejszy niż kilka ifów. Aczkolwiek nie popadałbym w skrajności. Po prostu przy układaniu dłuższych warunków układaj je tak, by zminimalizować ilość porównań.

Czy kompilator za mnie wybierze lepszą opcje? W każdym przypadku?

Jak będziesz pisał nieoptymalny kod, to kompilator nic nie poradzi.

komentarz 25 sierpnia 2022 przez Daaa22 Dyskutant (8,250 p.)

To pierwsze, jeśli zależy Ci na szybkości, to drugie - jeśli piszesz na platformy z mocno ograniczonymi zasobami. Najlepiej pamiętać o obu kwestiach.

Ale nie sugerować się tylko O(cośtam), tylko najlepiej ręcznie na kartce policzyć ile operacji zrobi program? Są gdzieś rozpisane informacje ile jaka instrukcja obliczeń zajmuje? Czy muszę się asemblera nauczyć i porównać instrukcje C++ do asemblera i policzyć ile ich jest?

Jak będziesz pisał nieoptymalny kod, to kompilator nic nie poradzi.

No właśnie o to mi chodzi, jaki kod jest optymalny, a jaki nie? Sugerować się tylko złożonością obliczeniową czy są jakieś złote rady których średnio zaawansowany programista nie zna? Na przykład żeby zamiast

int arr[200][200];
for(int x = 0; x < 200; x++)
    for(int y = 0; y < 200; y++)
        arr[x][y]=69;

 pisać

int arr[40000];
for(int i = 0; i < 40000; i++)
    arr[i]=69;

A może odwrotnie?

1
komentarz 25 sierpnia 2022 przez j23 Mędrzec (194,920 p.)

Są gdzieś rozpisane informacje ile jaka instrukcja obliczeń zajmuje?

Ale po co? Podczas normalnego pisania kodu takich rzeczy się nie robi. Niskopoziomową optymalizację robisz na samym końcu, jeśli w ogóle jest potrzebna (w 90% przypadków nie jest).

No właśnie o to mi chodzi, jaki kod jest optymalny, a jaki nie?

Optymalny kod to jest taki, który robi swoją robotę w granicach założonego czasu i zużycia pamięci.

Na przykład żeby zamiast (...) pisać (...)

Tak jak pisałem wcześniej: to są miktrooptymalizację, które niepotrzebnie zaciemniają kod. Czytelność kodu jest w większości przypadków ważniejsza od jakiejś ultra wydajności.

Skup się na algorytmach i strukturach danych, bo ich prawidłowy dobór ma kluczowe znaczenie.

komentarz 25 sierpnia 2022 przez Daaa22 Dyskutant (8,250 p.)

Dla sportu chciałem własny silnik szachowy napisać i czasami widzę kilka rozwiązań problemu i nie wiem które jest bardziej wydajne. A co do algorytmów to jeden może mieć wydajność O(n), a drugi O(n*log(n), ale co z tego skoro O() ukrywa współczynnik i ten O(n) to jest tak naprawdę 100000*n, a O(n*log(n)) to 2*n*log(n) i ten który rośnie szybciej tak naprawdę będzie bardziej wydajny. Na jakiej podstawie mam ocenić który algorytm jest bardziej wydajny? Samemu znaleźć te współczynniki? Wtedy potrzebuje wiedzieć jaka instrukcja ile obliczeń zabiera.

to są miktrooptymalizację, które niepotrzebnie zaciemniają kod

no program ze zrobionymi mikrooptymalizacjami chyba jest lepszy niż bez nich? Ważniejszy chyba jest jak najlepszy plik .exe niż sam kod? Szczególnie w przypadku pisania własnego silnika szachowego

2
komentarz 25 sierpnia 2022 przez adrian17 Ekspert (346,320 p.)

Na jakiej podstawie mam ocenić który algorytm jest bardziej wydajny?

Użyć/zaimplementować oba, zmierzyć w praktyce i porównać.

1
komentarz 25 sierpnia 2022 przez j23 Mędrzec (194,920 p.)

Dokładnie. Tego inaczej nie da się zrobić/obliczyć.

Ważniejszy chyba jest jak najlepszy plik .exe niż sam kod?

Im więcej kodu, tylko trudniej go utrzymywać i rozwijać. Jak napchasz w każdej funkcji różne tricki optymalizacyjne, to kod stanie się jeszcze mniej czytelny, trudny w analizie, a co za tym idzie - z potencjalnymi błędami. Program powinien przede wszystkim działać i być stabilny, a jak będzie wydajny tam, gdzie to jest oczekiwane, to jest to dodatkowy plus. Mikrooptymalizacje (i profilowanie kodu) robisz na końcu i tylko  w miejscach, gdzie jest to konieczne.

komentarz 26 sierpnia 2022 przez Daaa22 Dyskutant (8,250 p.)
A jak już mam gotowy kod i chce zrobić te mikrooptymalizacje, to w jaki sposób je zrobić?
1
komentarz 26 sierpnia 2022 przez j23 Mędrzec (194,920 p.)
Wrzucasz taki program na profiler, testujesz krytyczne partie kodu i już wiesz, która funkcja (czy nawet fragment kodu) jest wąskim gardłem. Wtedy zastanawiasz się, czy problemem jest zbyt częste wywoływanie funkcji, czy może zbyt dużo alokacji/dealokacji, tworzenia/niszczenia obiektów. Z pętli wywalasz wszystko to, co można obliczyć przed nią. Czasami duża pętle lepiej rozbić na wiele małych. Czasami rozwinięcie pętli może zredukować czas wykonania  (chodzi o redukcję ilość skoków warunkowych; chociaż te proste pętle mogą być rozwinięte przez kompilator w trybie -O3).

Na tym najniższym poziomie optymalizacji powinieneś zwracać uwagę na cache procesora.

Podobne pytania

0 głosów
0 odpowiedzi 427 wizyt
pytanie zadane 16 marca 2018 w C i C++ przez Utau Użytkownik (900 p.)
0 głosów
1 odpowiedź 412 wizyt
pytanie zadane 13 stycznia 2022 w C i C++ przez Michalineq Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 301 wizyt
pytanie zadane 14 grudnia 2021 w Sprzęt komputerowy przez TulismanoreV Nowicjusz (120 p.)

92,690 zapytań

141,603 odpowiedzi

320,098 komentarzy

62,050 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...