Optymalizacja oprogramowania - trudne pytanie

Odpowiedz Nowy wątek
2011-09-02 14:27
0

Panowie,

Podczas rozmowy o pracę dostałem następujące pytanie:
"W czym może być gorszy kod zoptymalizowany od tego, który nie został zoptymalizowany?"

Pytanie tyczy dwóch funkcji/metod robiących to samo. Pierwsza jest znacznie wolniejsza od drugiej (zoptymalizowanej) - dajmy na to 30 razy. Obie przeszły identyczne testy jednostkowe, więc możemy uznać, że ich poprawność działania jest identyczna. W czym więc ta szybsza może być gorsza? Strzeliłem, że być może wykorzystuje więcej pamięci (koleś na rozmowie mówił, że to nie to), a potem, że może powoduje spowolnienie wykonywania innych części kodu lub wątków (większy priorytet). Tutaj również nie trafiłem. W czym może być jeszcze różnica?

Pozostało 580 znaków

2011-09-02 14:31
MiL
0

Dla mnie to ona może być mniej czytelna. Ale pytanie beznadziejne.
Poza tym odpowiedź o ilości pamięci też jest poprawna bo z tego co piszesz chodzi o optymalizację pod względem szybkości.

edytowany 1x, ostatnio: MiL, 2011-09-02 14:32
Optymalizacja pod względem szybkości niekoniecznie musi zwiększać ilość zużywanej pamięci - byku_guzio 2011-09-02 17:31
Ale może. - MiL 2011-09-05 09:31

Pozostało 580 znaków

2011-09-02 14:31
0

W zrozumieniu? W łatwości modyfikowania?

Pozostało 580 znaków

2011-09-02 14:34
0
Afish napisał(a)

W zrozumieniu? W łatwości modyfikowania?

Faktycznie, o tym nie pomyślałem (cały czas miałem w głowie porównywanie już skompilowanego kodu) - to być może był ten brakujący element.

Pozostało 580 znaków

2011-09-02 14:44
0
Afish napisał(a)

W zrozumieniu? W łatwości modyfikowania?

To jest prawidłowa odpowiedź.
Czasami warto zostawić jedno przypisanie więcej lub wywołanie funkcji, aby zyskać na czytelności - o ile nie wpływa to znacząco na czas wykonywania.

Poza tym optymalizować można pod wieloma względami - jeśli optymalizujemy tylko pod względem prędkości to możliwe, że zwiększa się zużycie pamięci.

Z kolei gdy kod jest prze-optymalizowany (np. za dużo inline lub loop unroll) to nagle przestaje być kodem lokalnym i może się przestać mieścić w cache'u (chociaż nie wiem jak to możliwe - przy tych rozmiarach które są obecnie).

Pozostało 580 znaków

2011-09-02 17:11
0

nagle przestaje być kodem lokalnym i może się przestać mieścić w cache'u (chociaż nie wiem jak to możliwe - przy tych rozmiarach które są obecnie).

Jeśli nie mieści się w cache L1 dla kodu, czy też w trace cache (jak w niektórych Pentium IV czy Sandy Bridge) to ciągłe ładowanie/ dekodowanie kodu może być wąskim gardłem.

Jeśli chodzi o przypisania - kod w procesie optymalizacji jest transformowany do SSA (static single assingment), a potem usuwane są wspólne podwyrażenia. Deklarowanie nowych lokalnych stałych wcale nie musi zwiększać złożoności obliczeniowej, czy powodować większego zużycia pamięci.

Jestem generalnie zwolennikiem const correctness w C++, zresztą kompilatorowi łatwiej zoptymalizować program, jeżeli explicite podamy mu informację, że jakieś tam pola się nie zmieniają (są const). Myślę, że przy odpowiedniej dawce const corecctness w kodzie współczesne kompilatory są w stanie zoptymalizować jakiejś wyszukane szablony do takiej samej postaci jak wprost zoptymalizowane konstrukcje.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.

Pozostało 580 znaków

2011-09-03 21:20
0

Ja dodałbym jeszcze to że taki zoptymalizowany kod może być ciężki w debugowaniu(przejście przez testy nie gwarantuje, że kod jest w 100% poprawny).


Jeśli uważasz mój post za wartościowy - daj punkt.
Mój post pomógł Ci rozwiązać problem - zaznacz go.

Pozdrawiam

Pozostało 580 znaków

2011-09-03 21:42
0
Hostel napisał(a)

Ja dodałbym jeszcze to że taki zoptymalizowany kod może być ciężki w debugowaniu(przejście przez testy nie gwarantuje, że kod jest w 100% poprawny).

Miałem ostatnio przed oczami mniej więcej taki kod:

// duża petla a na jej końcu: 
if (warunek)
  zmiennaA = zmiennaB;
else
  zmiennaB = zmiennaA;

Podejrzewam że ktoś to tak napisał, bo mu było żal zrobić jedno przypisanie więcej, ale bądź potem mądry i taki kod analizuj...

Pozostało 580 znaków

2011-09-03 21:55
0

Kod zoptymalizowany może charakteryzować się tym, że jest sztywny i ciężej idzie dostosować go do ewentualnych zmian. Inny stopień optymalizacji jaki przychodzi mi do głowy to stosowanie np. funkcji typowo natywnych. Wiadomo to podnosi wydajność, ale tym samym ogranicza kod do mniejszej liczby platform. Można też większa wydajność osiągnąć stosując języki niższego poziomu np. jakiś algorytm wykonać w C a potem to wykorzystać w pythonie. Wtedy jako problem dodatkowo można wskazać większe ryzyko błędu, bo taki C na pewno jest mniej bezpieczny.

Moim zdaniem trochę przesadzone w części "(...)C na pewno jest mniej bezpieczny." Tutaj chodzi po pierwsze o błędy w bibliotekach zewnętrznych a to że C to nie ma znaczenia a po drugie samemu można źle wykorzystać daną bibliotekę, co może sugerować że np. nie u nas jest błąd a on w rzeczywistości leży po naszej stronie. - Hostel 2011-09-03 22:03

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0