Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czy warto optymalizować kod będąc początkującym programistą?

Ostatnio zmodyfikowano 2013-05-23 14:10
Autor Wiadomość
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:
C/C++
#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++;
        } //if
    } while( wylosowanych < 5 );
   
    wylosowanych = 0;
    do
    {
        std::cout << wylosowane[ wylosowanych ] << std::endl;
        wylosowanych++;
    } while( wylosowanych < 5 );
   
    return 0;
}

KOD mój:
C/C++
#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.
P-83652
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
P-83653
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ł:
C/C++
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?
P-83658
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ć :)
P-83659
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).
P-83660
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
P-83661
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 :)
P-83662
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.
P-83663
« 1 » 2
  Strona 1 z 2 Następna strona