optymalizacja kodu w C++

0

Cześć,
właśnie przeczytałem sobie ten artykuł: http://umniedziala.net/2011/06/google-prezentuje-benchmarki-czterech-popularnych-jezykow-programowania/ w którym z takim fragmentem

C++ jest nadal niekwestionowanym liderem wydajności (informacja ta zostaje nam przekazana z uwagą, że C++ wymagał najwięcej pracy włożonej w optymalizację kodu – część z nich była niezwykle wyrafinowana, więc nie używana przez programistów „ze średniej półki”),

No i z uwagi, że uczę się programować właśnie w C++ zastanawiam się o co chodzi autorom, że język C++ wymaga najwięcej pracy włożonej w optymalizację? Czy może mi ktoś napisać kilka przykładów?

Dodatkowo w artykule jest informacja, że:

w przypadku wszystkich testowanych języków programowania (a ściślej – ich kompilatorów) nie były wykorzystywane „sztuczki” specyficzne dla danego języka, służące poprawieniu wydajności.

Czy może mi ktoś podać przykład takiej "sztuczki" w c++? I czym ona się różni od w/w optymalizacji?

Kolejne pytanie dot. przyszłości C++. Z wykresów np. stąd: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html można zauważyć, że C++ od dłuższego czasu traci zwolenników. Głównymi rywalami są: C# i Objective-C. Czy tzn. że C++ za kilka lat zupełnie przestanie dominować i "umrze"? (o Javie i C nie piszę, bo one są faworytami od dłuższego czasu). Czy jest jakaś szansa na wzrost popularności C++? Czy jego odmiana C++0x ma szansę jego wskrzeszenia?

Z góry dzięki za wasze wypowiedzi.
pozdrawiam

0

Autor przez "sztuczki" rozumie zapewne włączenie optymalizacji kompilatora. Przykłady? Wywalanie kawałków kodu które "nic dają żadnych efektów". np.

int main(){
  for (int i=0;i<1000000;i++){
    int x = bla bla //tutaj jakieś dziwne operacje
  }
  return 0;
}

Kompilator może to przeanalizować i w kodzie wynikowym po prostu tej pętli nie będzie.
Inne sztuczki? inlinowanie funkcji, rozwijanie pętli itd

0

Dzięki za odpowiedź.
A może się jeszcze ktoś wypowiedzieć odnośnie przyszłości C++ :)
Uczę się tego języka ale mam małe obawy, że czy dobrze wybrałem :P

2

@WojtekMi mówisz tak jakby programiści znali tylko jeden język...

0

Ale ja nie jestem programistą - robię to tylko hobbistycznie i nie mam ambicji uczyć się kolejnych języków (zawodowo zajmuję się inną działką) :P

0
WojtekMi napisał(a):

Ale ja nie jestem programistą - robię to tylko hobbistycznie
tym bardziej nie rozumiem twoich obaw dotyczących wyboru języka :|

0

No bo zawsze mogłem wybrać lepiej :)
I zawsze można zmienić wybór - chociaż już dużo przeszedłem i nie chce mi się uczyć nowych rzeczy... :)

A tak w ogóle to czemu nikt nie lubi C++? Tzn. większość ludzi źle się o nim wypowiada... Jaką on ma wadę w porównaniu np. do C#? Oczywiście pomijam, że w C# nie ma dynamicznego alokowania pamięci - tzn. kompilator dba o czyszczenie pamięci. Ale przecież to nie może być jedyny powód...

0

W C++ robi się nowoczesne gry (żeby wycisnąć ze współczesnego sprzętu jak najwięcej). Java też jest napisana w C++. Jądra niektórych systemów operacyjnych też są w C++. Wszędzie tam gdzie stawia się na wydajność, nie używa się kodu zarządzanego typu Java, C#. Bierze się rozwiązania niższego poziomu, typu C, C++. Wszystko jest od siebie zależne (wspomniana Java nie powstała z powietrza, tylko napisana jest w C++, np. Python jest w C). Poza tym ogromne ilości kodu starszych aplikacji już zostały napisane w C++ i bez jakiegoś sensownego powodu nie będzie nagle wszystko przepisywane na C# :) To, że częściej rekrutuje się programistów Java/C# nie świadczy o tym, że C++ umiera :D Po prostu oprogramowanie, które powstało w C++, często ma już swoich developerów.

2

c++ to język, który umożliwia ci pisanie dosyć niskopoziomowe jak i wysokopoziomowe. Udostępnia większą kontrolę nad kodem oraz jego elementami w przeciwieństwie np. do javy czy c# - przykład? Zarządzanie pamięcią - w c++ masz pełną kontrolę nad tym co kiedy ma powstać i kiedy ma zostać zniszczone, w wyżej wymienionych językach takowej możliwości bezpośrednio nie masz, a nawet jeśli masz to nie jest to samo co w c++. Oczywiście taki charakter języka nie zawsze jest pozytywny. Czasem dla programistów czas wykonania programu nie jest tak istotny w porównaniu do czasu jaki trzeba przeznaczyć na jego napisanie, a w c++ niestety przez to, że daje on większą swobodę programiście naturalnie powoduje, że na napisanie w nim programu trzeba przeznaczyć więcej czasu. Ponadto c++ posiada dosyć zawiłą składnię, można w nim tworzyć naprawdę mało czytelny kod. C++ daje możliwość pisania w różnych paradygmatach programowania więc można stwierdzić, że jest elastyczny jednak język, który udostępnia dużo możliwości zwiększa również ryzyko popełnienia większej ilości błędów, a co za tym idzie programując w nim musisz czujniej tworzyć swój kod i poświęcić więcej czasu na jego zabezpieczenie. Ogólna znajomość c++'a jest przydatna tym bardziej, że duża część języków wysokopoziomowych bazuje na nim - na pewno nie zaszkodzi go znać. Z drugiej strony c++ to język, który nawet po kilkunastu latach programowania w nim potrafi zaskoczyć - niektórzy uważają to za jego zaletę, a inni za wadę.

Byłbym ostrożniejszy ze stwierdzeniami typu "nikt nie lubi c++" bo posiada on swoich zwolenników jak prawie każdy inny język. Znajomość kilku języków programowania jest przydatna ponieważ język to tylko narzędzie i nieraz zanim programista zabierze się za napisanie aplikacji zastanawia się który język może być najlepszy do tego typu programu. Wiadomo, że mając do wyboru "pierd.olnik kinetyczny z trzonkiem naprowadzającym" i majzel bądź młot z udarem i do roboty wyrąbanie połowę ściany to lepiej chyba użyć młota udarowego niż młoteczka pomimo, że młoteczkiem wykonanie takiej pracy również jest możliwe.

pozdrawiam.

0

a poza tym, znajac dobrze C++, zrozumienie javy/c# to kwestia 1 dnia.

0

dzięki za wasze wypowiedzi!
Tak więc chyba zostanę przy C++ :)

2

Witam ! Fakt, jako programista pracujący w zawodzie znam kilka języków i w zależności od potrzeb pisze się w czym się da. Programista znający jeden język jest właściwie kaleki. Do tego dochodzą języki znaczników. Kiedyś też rzucałem się na c++ jak student na kebaba. Obecnie pracuję jako programista c++ , przy czym piszę trochę w C# ( notabene nie uczyłem się C#, po prostu odpaliłem IDE i zacząłem pisać, te języki nie różnią się aż tak bardzo). W C++ jest wiele rzeczy nieintuicyjnych, trudnych, brzydkich i w ogóle blech ... C++ jest językiem wielkim i do wszystkiego, i przez to czasami trudno go ogarnąć, a kod w nim produkowany czasami sam się psuje czy to kiepski programista musi stawiać hacki. Wszystko to wychodzi z nieznajomości języka i braku doświadczenia, ale poznać C++ to na prawdę wyczyn. Sam go nie znam tak dobrze jak niektórzy tutaj. Pozwolę sobie przytoczyć parę postów deusa z dyskusji nt. tego języka, które w dziwnym zbiegu okoliczności były mi ostatnio potrzebne.

Jakie języki dla przyszłego programisty???
Jakie języki dla przyszłego programisty???
Jakie języki dla przyszłego programisty???
http://4programmers.net/Forum/Flame/160793-Programista_CC++?p=635228#id635228

Tutaj wylistowałem najciekawsze posty i strony, ale polecam przeczytać całe wątki.

Natomiast jeśli chodzi o optymalizacje. C++ jest językiem wysokiego poziomu, ale można operować bezpośrednio na pamięci czy nawet rejestrach procesora. Przy odpowiednich ustawieniach kompilatora, można własować zmienną interacyjną np. z kodu :

for(i=0;i<x.i++) ...; 

do rejestru procesora co przyspieszy wielokrotnie dostęp do niej. Dalej znając architekturę procesora można rozwijać pętle, czyli np. w powyższym forze zamiast i++ iść krokami i+=6. Tutaj dochodzi wiedza o cache procesora, ile ma linii, ilu drożny jest. Chodzi o to, ze dane z pamięci są kopiowane do procesora porcjami określonej długości - taki jaki jest cache. Mając w cache możliwość zmieszczenia np. 128 zmiennych danego typu, sięgając do każdej zmiennej z osobna czas dostępu jest podobny jakby sięgnąć do wszystkich 128 na raz, i właśnie dlatego rozwija siępętle.

Można używać operacjach na pamięci bezpośrednio i kopiować dane komórki co przyspiesza pracę programu.
Stosuje się prefetching danych przez jawne sięganie do nich lub stosowanie odpowiednich makr ( g++). Wykonywanie większości operacji poza pętlami, czy sklejanie pętli w jedną. Pisząc aplikacje dla treningu na pałę mnożącą macierze a potem stosując optymalizacje osiągnąłem zysk ~625% w czasie wykonania aplikacji. Tylko ze to nie był wielki kod i zadanie było też trywialne. Wszystko to przyspiesza działania programu, ale zmniejsza czytelność kodu i jest bugo-twórcze. Jeśli ktoś zna ten język to może sobie na to pozwolić, jednak najczęściej z tą znajomością jest najgorzej, i sam człowiek potrafi się zaskoczyć czasami swoją niewiedzą.

0

Witam ! Fakt, jako programista pracujący w zawodzie znam kilka języków i w zależności od potrzeb pisze się w czym się da. Programista znający jeden język jest właściwie kaleki. Do tego dochodzą języki znaczników. Kiedyś też rzucałem się na c++ jak student na kebaba. Obecnie pracuję jako programista c++ , przy czym piszę trochę w C# ( notabene nie uczyłem się C#, po prostu odpaliłem IDE i zacząłem pisać, te języki nie różnią się aż tak bardzo). W C++ jest wiele rzeczy nieintuicyjnych, trudnych, brzydkich i w ogóle blech ... C++ jest językiem wielkim i do wszystkiego, i przez to czasami trudno go ogarnąć, a kod w nim produkowany czasami sam się psuje czy to kiepski programista musi stawiać hacki. Wszystko to wychodzi z nieznajomości języka i braku doświadczenia, ale poznać C++ to na prawdę wyczyn. Sam go nie znam tak dobrze jak niektórzy tutaj. Pozwolę sobie przytoczyć parę postów deusa z dyskusji nt. tego języka, które w dziwnym zbiegu okoliczności były mi ostatnio potrzebne.

Jakie języki dla przyszłego programisty???
Jakie języki dla przyszłego programisty???
Jakie języki dla przyszłego programisty???
http://4programmers.net/Forum/Flame/160793-Programista_CC++?p=635228#id635228

Tutaj wylistowałem najciekawsze posty i strony, ale polecam przeczytać całe wątki.

Natomiast jeśli chodzi o optymalizacje. C++ jest językiem wysokiego poziomu, ale można operować bezpośrednio na pamięci czy nawet rejestrach procesora. Przy odpowiednich ustawieniach kompilatora, można własować zmienną interacyjną np. z kodu :

for(i=0;i<x.i++) ...; 

do rejestru procesora co przyspieszy wielokrotnie dostęp do niej. Dalej znając architekturę procesora można rozwijać pętle, czyli np. w powyższym forze zamiast i++ iść krokami i+=6. Tutaj dochodzi wiedza o cache procesora, ile ma linii, ilu drożny jest. Chodzi o to, ze dane z pamięci są kopiowane do procesora porcjami określonej długości - taki jaki jest cache. Mając w cache możliwość zmieszczenia np. 128 zmiennych danego typu, sięgając do każdej zmiennej z osobna czas dostępu jest podobny jakby sięgnąć do wszystkich 128 na raz, i właśnie dlatego rozwija siępętle.

Można używać operacjach na pamięci bezpośrednio i kopiować dane komórki co przyspiesza pracę programu.
Stosuje się prefetching danych przez jawne sięganie do nich lub stosowanie odpowiednich makr ( g++). Wykonywanie większości operacji poza pętlami, czy sklejanie pętli w jedną. Pisząc aplikacje dla treningu na pałę mnożącą macierze a potem stosując optymalizacje osiągnąłem zysk ~625% w czasie wykonania aplikacji. Tylko ze to nie był wielki kod i zadanie było też trywialne. Wszystko to przyspiesza działania programu, ale zmniejsza czytelność kodu i jest bugo-twórcze. Jeśli ktoś zna ten język to może sobie na to pozwolić, jednak najczęściej z tą znajomością jest najgorzej, i sam człowiek potrafi się zaskoczyć czasami swoją niewiedzą.

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