Rafals Temat założony przez niniejszego użytkownika |
Czy warto optymalizować kod będąc początkującym programistą? » 2013-05-23 00:16:25 Witam ponownie.
W lekcji formułujemy problem, a następnie piszemy program, który go rozwiąże. Zalecane było, aby spróbować napisać samemu ten program. Napisałem.
Pytanie brzmi, który kod jest bardziej optymalny i dlaczego?
KOD z lekcji:
#include <iostream> #include <cstdlib> #include <ctime>
bool czyBylaWylosowana( int iLiczba, int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int wylosuj() { return( rand() % 10 ) + 1; }
int main() { srand( time( 0 ) ); int wylosowane[ 5 ]; int wylosowanych = 0; do { int liczba = wylosuj(); if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) { wylosowane[ wylosowanych ] = liczba; wylosowanych++; } } while( wylosowanych < 5 ); wylosowanych = 0; do { std::cout << wylosowane[ wylosowanych ] << std::endl; wylosowanych++; } while( wylosowanych < 5 ); return 0; }
KOD mój:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std;
int wylosuj( int Min, int Max ) { int losowana =( rand() %( Max - Min + 1 ) + Min ); return losowana; }
bool sprawdz( int t[], int t_miejsce, int i_liczba ) { int licznik = 0; do { if( t[ licznik ] == i_liczba ) return false; licznik++; } while( licznik < t_miejsce ); return true; }
int main() { srand( time( NULL ) ); int tablica[ 5 ], rozmiar; int Min, Max, i_liczba, licznik; bool sprawdzT; Min = 1; Max = 10; rozmiar = 5; licznik = 0; do { i_liczba = wylosuj( Min, Max ); sprawdzT = sprawdz( tablica, licznik, i_liczba ); if( sprawdzT ) { tablica[ licznik ] = i_liczba; licznik++; } } while( licznik < rozmiar ); licznik = 0; do { cout << tablica[ licznik ] << ", "; licznik++; } while( licznik < rozmiar ); return 0; }
U mnie więcej zmiennych przez to, że tylko w jednym miejscu będę musiał zmienić wartości, zmienić zakres losowania czy wielkość tablicy. |
|
DejaVu |
» 2013-05-23 00:38:18 Nie ma sensu rozważać aspektów optymalizacyjnych na poziomie podstaw programowania. Ręczę Ci i gwarantuję, że nie jeden absolwent studiów IT nie potrafi oszacować złożoności obliczeniowej algorytmu ani stwierdzić 'co będzie szybsze'. Złożoność obliczeniową algorytmów warto analizować dopiero wtedy, gdy masz dużą aplikację, dużo danych i pojawia się problem ze zbyt długim czasem reakcji aplikacji na wykonanie danej czynności. Wówczas masz dobre środowisko zarówno do analizowania problemu jak i testowania nowych rozwiązań. Co więcej, koncentrujesz się wtedy stricte na optymalizacji i dociekaniu 'dlaczego to jest lepsze', a nie... próbujesz robić z siebie Greka nie wiedząc tak na dobrą sprawę prawie nic o języku programowania, którego używasz :) Wiedz również, że to nie jest żadna złośliwość czy cokolwiek innego - po prostu odpowiedź na Twoje pytanie nie ma sensu, bowiem nawet proponując algorytm z dużo lepszą złożonością obliczeniową, czas obliczeń będzie niezauważalny dla tak małego zbioru danych.
W dużym uproszczeniu można powiedzieć: oba algorytmy są porównywalne, bowiem rozmiar danych jest stały, a zatem złożoność obliczeniowa algorytmów jest stała :P |
|
Rafals Temat założony przez niniejszego użytkownika |
» 2013-05-23 00:54:52 Spoko nie wziąłem tego za złośliwość, jak i masz rację, że nic nie wiem o programowaniu ;) Może źle zadałem pytanie. Miało znaczyć to tyle co, jak mój kod wygląda w stosunku do profesjonalisty, na co zwrócić uwagę, aby w przyszłości w trakcie analizy kodu mieć większy porządek. Np. z tego co napisałem w tej chwili bym zmienił: sprawdzT = sprawdz( tablica, licznik, i_liczba ); if( sprawdzT ) na if( sprawdz( tablica, licznik, i_liczba ) ) Pisząc optymalny nie miałem na myśli optymalności pod względem szybkości działania tylko przejrzystości i hmm wykonania według sztuki programowania? |
|
DejaVu |
» 2013-05-23 01:00:23 Na to też nie masz co zwracać specjalnej uwagi - powinieneś przede wszystkim starać się dzielić kod na 'powtarzalne' fragmenty, tj. jeżeli wiesz, że jakieś bardziej złożone operacje będziesz chciał kilka razy wykonać w różnych miejscach w kodzie, to powinieneś utworzyć odpowiednią funkcję. Ponadto na początku drogi programowania najważniejsze jest to, by rozumieć to, co się pisze, a nie przepisywać dobre rozwiązania 'bo ktoś lepszy je napisał' :) Kurs C++ z tej strony wcale nie przedstawia wyrafinowanych rozwiązań - on się koncentruje na tym, by materiał 'sprzedać' w możliwie najprostszej formie, pokazując jednocześnie jak należy stosować w praktyce nowo poznaną wiedzę. W praktyce wiele rzeczy można napisać w jednej/dwóch linijkach zamiast 15 czy też 20 wierszy, ale to jest wypadkowa zdobytego doświadczenia i wielu lat programowania, które początkującego może po prostu odstraszyć :) |
|
cyklopek11 |
» 2013-05-23 01:00:45 Np. z tego co napisałem w tej chwili bym zmienił: C/C++ sprawdzT = sprawdz( tablica, licznik, i_liczba ); if( sprawdzT ) na if( sprawdz( tablica, licznik, i_liczba ) )
|
Ja jestem hobbystą i z tego co na razie mam wiedzę (i deasemblacji) przypuszczam, że oba powyższe fragmenty kodu, byłyby identyczne pod względem kodu maszynowego a jedyny niuans z nimi związany to czytelność na poziomie kodu c++. PS Jak sądzisz DejaVu, czy taki początkujący czy też średniak (ja :-) w trakcie pisania swojego, tam prostego kodu powinien już w trakcie pisania obmyślać tricki optymalizujące np. szybkość czy dopiero jak wykona prototypowy działający program? Chodzi mi o taki kod 2000 linijek (czytelnych ale bez rozwlekania). |
|
Rafals Temat założony przez niniejszego użytkownika |
» 2013-05-23 01:07:01 Ok także póki co przestanę się przejmować jak to ma wyglądać, byle działało poprawnie i było napisane własnymi "ręcoma" ;] Tylko wiecie, niektórym profesorskim zakutym pałom nie wystarczy, że działa poprawnie i potrafię obronić, jeszcze ma wyglądać ;p Ale to dopiero za 5 miesięcy zacznę się nimi martwić. Chociaż myślę nad sensem studiów informatycznych w wieku 27 lat ;) Stary ale jary ;p |
|
DejaVu |
» 2013-05-23 01:16:12 Przeceniasz uczelnie i kadrę nauczającą ;p Zadaniem wykładowców jest wyłożyć przedmiot, posprawdzać kolokwia/egzaminy i wystawić oceny. Studia w naszym kraju są tylko i wyłącznie konieczną edukacją, a nie profesjonalną wiedzą merytoryczną. Ja zrobiłem studia tylko i wyłącznie po to, aby mieć 'papier', a nie po to by się tam czegoś nauczyć. Idąc na studia miałem już dużą wiedzę z tego co mnie interesowało, a studia tylko pokazały mi, że wszystko jest omawiane zarówno po łebkach jak i na poziomie podstawowym. Ponadto większość przedmiotów jest tworzona pod kadrę, a nie pod praktyczne zastosowanie w IT, więc... siłą rzeczy studia to tak na dobrą sprawę 'papier, papier, papier'.
No ale mimo wszystko zachęcam do zrobienia studiów - choćby dla papieru :) |
|
Rafals Temat założony przez niniejszego użytkownika |
» 2013-05-23 01:23:00 W większości się z Tobą zgodzę, aczkolwiek uczelnia na którą się wybieram współpracuje z hmm jak oni to nazywali "zrzeszenie małych, średnich i dużych przedsiębiorstw" jakoś tak. Między innymi na praktyki w MS można trafić. Jak i z tego co się orientuję wielu praktyków tam wykłada. Chociaż jest to nadal uczelnia prywatna ;). Wszystko zależy jaki wykładowca, jedna grupa miała zaliczone laborki za to, że przychodzili na zajęcia, a inna musiała już w pierwszym semestrze klepać proste gry strategiczne na konsole, aby otrzymać 5 ;). Zapomniałem, uczelnia to WSNHiD w Poznaniu. Do jutra. Dobranoc. |
|
« 1 » 2 |