Skocz do zawartości

[C++] Do czego potrzebny jest czas wykonania programu?


Recommended Posts

  • 3 tygodnie później...

z założenia jak piszesz w C++ to masz pisać dobrze zoptymalizowane programy, bo inaczej równie dobrze można to w javie napisać, niestety czy w gimnazjum, czy liceum, czy szkole zawodowej, czy nawet na studiach (zależy jeszcze gdzie i kto), rzadko kto w ogóle porusza temat optymalizacji, mogą cię uczyć nawet wątkowości bez tego. 

Ogólnie pewne pętle, sortowania, tablice, są lepsze od innych, zależnie od typu i ilości danych. W 99% nie przydaje się to w toku nauczania, ale w pracy już w 90% tak.
Warto sobie przejrzeć parę książek do programowania jak masz czas, aby choć podstawowych zasad optymalizacji się nauczyć, np nie zagnieżdżaj pętli w pętli przy dużych zbiorach danych, jeśli nie jest to konieczne itp. 
 

Link to post
Share on other sites

Kontrprzykład javy nietrafiony, bo obecnie z nowym JIT jest to najwydajniejszy język programowania, razem z Cpp. Oba języki dominują w HFT.

 

A czas wykonania jest, bo ktoś go tam dał. Nie ma w tym żadnego wyższego celu. To samo można zrobić samemu w 30s w teście jednostkowym.

Edytowane przez Karister
Link to post
Share on other sites
Ogólnie pewne pętle, sortowania, tablice, są lepsze od innych, zależnie od typu i ilości danych. W 99% nie przydaje się to w toku nauczania, ale w pracy już w 90% tak.

 

Hmm, sortowania to faktycznie jedne są lepsze od drugich, nie za bardzo rozumiem co mają tu tablice do rzeczy, tablicę możesz mieć zmiennych, obiektów, może być tablicą jednowymiarową, dwuwymiarową ,może być to tablica wskaźników wskazujących na jakiś dany typ czy też tablica wskaźników wskazująca na kolejny wskaźnik. 

Odnośnie tablic można się co najwyżej podpiąć pod sposob odwoływania się do elementów tablicy. Z czego jeden jest lepszy ze względu na mniejszą ilość operacji jaką trzeba by wykonać by się tam dostać.

Bo chyba nie mówimy, STL'u bo to mija się z celem :D

Także rozwiń, bo nie za bardzo wiem o co chodzi. 

 

 

Kontrprzykład javy nietrafiony, bo obecnie z nowym JIT jest to najwydajniejszy język programowania, razem z Cpp. Oba języki dominują w HFT.

 

Trafiony ;)

Java jest prosta i właściwie programista, może mieć gdzieś zarządzanie pamięcią, ale jest wolna w porównaniu z C++. Żaden język interpretowany nie będzie szybszy od kompilowanego, interpreter ma swoje plusy, ale patrząc na C++17 i udoskonalenia które są wprowadzane, wybacz chłopie ale Java to ślimak mimo tego że CPP to dziadek ;)

Edytowane przez Andrew
Link to post
Share on other sites

Wybacz chłopie, ale Java nie jest interpretowana, litości. I Java sprawdza się w HFT tak samo dobrze, jak Cpp ze swoją wydajnością. Takie są fakty, ale ludzie wolą powtarzać dyrdymały sprzed dekady.

Edytowane przez Karister
Link to post
Share on other sites

Najwyraźniej będę musiał się powtórzyć.

 

Dyrdymały. Tak po prostu. Ludzie lubią paplać na tematy, o których nie mają zielonego pojęcia i uchodzić za znawców. "Taka jest struktura tego języka","ma swoje założenia", "tam się sprawdza bardzo dobrze" - ogólniki, ogólniki i jeszcze raz ogólniki bez jakichkolwiek konkretów. Masło maślane. Dlatego zamiast powtarzać po innych głupoty typu "Java jest wolna", lepiej jest samemu się zorientować w temacie i zasięgnąć informacji z dobrych źródeł. Wtedy trafisz na konkrety. I jednym z nich jest LMAX Disruptor. Tak, Java była kiedyś bardzo wolna. Dziś jest jednym z najszybszych języków.

 

Tak, C# jest grą karcianą. A Scala planszową. Teraz szybko na kilka for komputerowych i szerzyć nowinę. Niech inni powtarzają. W końcu nie może być inaczej, skoro tak napisali.

Edytowane przez Karister
Link to post
Share on other sites

@@Karister, mi chodzi o "wymogi optymalizacji", w c++ a java jako przykład i tu też wchodzi zarządzanie pamięcią (o to np. przy tablicach mi chodziło).
Słabo zoptymalizowany kod c++, a słabo zoptymalizowany kod java, dobrze zoptymalizowany kod c++, a dobrze zoptymalizowany kod java itp. W C++ jak dla mnie, można po prostu łatwiej słabo zoptymalizowany kod napisać, niż w javie. Nie jestem samobójcą, aby na forum benchmark.pl powiedzieć że jedno jest szybsze od drugiego...
Jak chcecie szybkości to kod maszynowy się kłania, cała reszta będzie zależeć od tego co chcemy zrobić, jak i od konkretnej wersji. 

Link to post
Share on other sites

 

 

Andrzej ty pracujesz zawodowo jako programista?
 

Siedzę w tym, ale jeszcze nie zawodowo, póki co studiuję, a przy okazji robię tam różne rzeczy. 

Pisałem w C,C++,Java,C#,Python,VHDL,LabView, Matlab,Bash,IL,LD,SQL w Assemblerze też operowałem. Ale nie wiem czy chcę to robić zawodowo. Nie chcę być typowym nerdkiem który siedzi przed kompem i klepie kod. 

Po prostu się tym interesuję, przynajmniej na razie :D

 

Ogółem jak zna się zasady z C/C++ to można pisać w każdym języku. Gorzej z SQLem bo to język zapytań, jest łatwiejszy, ale trzeba myśleć, że tak powiem w większym zakresie by te zapytania były dobrze napisane, dlatego też najczęściej się tworzy interfejs w postaci procedur a resztę zostawiamy osobie która stworzyła bazę.

 

 

@up

 

W każdym języku da się napisać taki kod, że będzie to działało tragicznie :P Ogółem C jest pod takim względem dobry, że to my dbamy o to co wrzucamy czy zdejmujemy z pamięci, w Javie działa, no powiedzmy prosto, automat, który wykrywa czy dana jest jeszcze używana czy też nie i wtedy ją zdejmuje. Czyli teoretycznie wystarczy wywalić referencję do danego obiektu czy zmiennej i on po nas posprząta.

Link to post
Share on other sites

W C++ jak dla mnie, można po prostu łatwiej słabo zoptymalizowany kod napisać, niż w javie.

 

To prawda. Java jest idiotoodporna i ma łatwe w użyciu biblioteki standardowe. Zespół wymiataczy C++ zapewne napisze kod o kilka % szybszy od Javowego. Ale jeśli weźmiemy realne warunki - zespół normalnych/dobrych programistów i cały system do zrobienia - Java ułatwia wiele rzeczy i pozwala uniknąć różnych błędów.

 

Ogółem jak zna się zasady z C/C++ to można pisać w każdym języku. 

 

To jest mój ulubiony mit numer 2 w internetach. ;) Kolejna rzecz, która się przedawniła, gdy pojawiło się coś więcej od Pascala i Delphi. Podobne są takie elementy jak, if, for, zmienne, itd. Zaawansowane mechanizmy wyglądają inaczej w różnych językach programowania. Kilka przykładów:

  • C# nie ma checked exceptions, a Java (niestety) ma
  • Java nie ma multiple dispatch, a C# ma (od wersji 4.0), więc overloading metod zadziała inaczej
  • Autoboxing Javy może doprowadzić do tego, że 5 == 5 zwróci false
  • Double lock singleton pattern w C# jest thread-safe, a w Javie nie (od Javy 6 jest ze słówkiem kluczowym volatile)

A to wszystko w ramach języków o tym samym paradygmacie - obiektowy plus nieco proceduralnego. A są inne. Weźmy Haskella albo Scalę. To jest zupełnie inny świat - programowanie funkcyjne. A jest też paradygmat logiczny.

 

Na koniec dochodzi jeszcze to, że język to tylko narzędzie. Przy programowaniu dużych systemów dochodzą specyficzne biblioteki, frameworki oraz wiedza domenowa - znowu nauka od nowa. Ja umiem pisać webówkę w Javie, ale nie zaryzykowałbym stwierdzenia, że umiem zrobić webówkę w PHP, albo apkę mobilną w Javie. Na pewno nauka poszłaby mi sprawniej od osoby początkującej, ale to jest nadal dużo nauki.

 

Tak więc pisanie, że znając jeden język, można pisać w innych sprawdza się tylko w studenckich projektach.

Edytowane przez Karister
  • Popieram 1
Link to post
Share on other sites
Zaawansowane mechanizmy wyglądają inaczej w różnych językach programowania. Kilka przykładów:

 

Nie wiem co według Ciebie jest mitem, kilka prostych przykładów które pokazują różność rozwiązań/mechanizmów które są w językach. 

No ok i co dalej?

 

Podajesz mi kilka przykładów, mechanizmów które zależą od tego co zostało "zaimplementowane", nie wiem gdzie widzisz problem, jak się czegoś używa to sprawdza się w dokumentacji jak to działa,zależnie od tego co jest w danej chwili potrzebne.

Nawet czasem nie dokumentacja, wystarczy wpisać wujkowi co leży na sercu i czasem nawet pomoże.

 

C# nie ma checked exceptions, a Java (niestety) ma

Może jest to uciążliwe, ale zauważyłem plusy tego rozwiązania.

 

Dobra podstawa C++ otwiera furtkę do innych języków i to powie Tobie praktycznie każdy. To tu zaczyna się rozumienie, tego jak to funkcjonuje. 

 

dochodzą specyficzne biblioteki, frameworki oraz wiedza domenowa

Biblioteki/Frameworki w tych nowych językach jest praktycznie wszystko podane pod pysk, także tu nie ma co mówić o wiedzy, tylko o umiejętności wykorzystania tego co zostało dostarczone.

 

 

 

Ja umiem pisać webówkę w Javie

 

Przyznaję się, temat WEB mnie nie interesuje, także w tym temacie nie ryzykowałbym, że jestem wstanie coś napisać. 

Ale aplikacje na PC czy mobilne jak najbardziej. Aktualnie siedzę w Android Studio. I tak to Java a dwa, tak są inne mechanizmy a trzy, znajomość C++ pomaga ;)

 

Tak więc pisanie, że znając jeden język, można pisać w innych sprawdza się tylko w studenckich projektach.

Nie piszę, że wystarczy znać jeden język, napisałem, że wystarczy znać jeden by mieć otwartą furtkę do innych języków ;) Trochę nie rozumiesz sentencji.

BTW. W studenckich projektach, nawet nie trzeba znać programowania. 

Na studiach są też takie cwaniaki które kupują programy w sieci za powiedzmy 50zł, także by oddać projekt to nawet nie trzeba go robić.

Edytowane przez Andrew
Link to post
Share on other sites

Może musiałbyś zobaczyć duży system enterprise, żeby zrozumieć, o co chodzi. Mitem jest, że znając C++ (czy cokolwiek innego), łatwo przerzucisz się na nowy język (w kontekście pracy zawodowej). Dzisiaj systemy są olbrzymie, jest masa niuansów, które zaskakują. Jasne, że łatwiej się uczy kolejnych języków, ale to nie jest tak, że będziesz w stanie dobrze pracować z nowymi technologiami po miesiącu. Będziesz utykał na takich tematach jak pula połączeń do bazy danych, transakcje, synchronizacja wątków, itp. Ale takie problemy nie występują w domowych projektach.

 

Także nauka frameworków wymaga sporo czasu i nieprawdą jest, że wszystko jest "podane pod pysk". Tylko, żeby to zauważyć też trzeba siedzieć nad czymś na poziomie. Na przykład nad rozproszonymi systemami w środowisku mikroserwisów. Wtedy nieumiejętne stosowanie frameworka prowadzi do locków na bazie danych, zgubionych komunikatów, deadlocków, wyścigów, wywalonych transakcji, itd. Skala (setki gigabajtów danych i dziesiątki zapytań na sekundę) powoduje, że to co działa na localhoście wywala się w najbardziej fantazyjne sposoby w rzeczywistym świecie. Trzeba sporo doświadczenia, żeby frameworków dobrze używać. Nie wspominając o cudach, dziejących się w niektórych ORM.

 

Nigdzie też nie pisałem, że wystarczy znać jeden czy wiele języków, więc nie wiem, czego miałbym tu nie rozumieć. Wyraźnie pisałem, że nie wystarczy znajomość jednego, języka, by sprawnie używać drugiego w skomplikowanych systemach bez poświęcenia sensownej ilości czasu na naukę różnic. Natomiast, jak najbardziej uważam, że wystarczy dobrze znać jeden język. Do tego dodatkowo jakiś inny skryptowy na średnim poziomie, żeby ułatwić sobie codzienne czynności. Bardzo rzadko ktoś wymaga biegłości w dwóch językach.

 

Podsumowując:

Tak, znając jeden język programowania, łatwiej się uczy kolejnych.

Tak, znając jeden język, szybko można pisać małe projekty w innym.

Nie, znając jeden język programowania, nie da się szybko zacząć pisać systemów enterprise w innym.

Nie, frameworki (przynajmniej webowe dla Javy) nie są proste.

Edytowane przez Karister
Link to post
Share on other sites

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...