Lepiej dużo kodu czy dużo funkcji?

0

Zastanawiam się czy lepiej jest pisać raz, dwa razy używany kod w jak największej liczbie funkcji czy bezpośrednio w programie. Funkcje są kopiowane a więc teoretycznie zwiększyłoby to objętość .exe od kodu dwukrotnie jednak zrobił by się chociaż w kodzie porządek. Dlatego chciałbym się zapytać, czy kod to przeważająca rzecz przy objętości czy jest to raczej wynik dołączania funkcji języka lub dodatkowych obrazków?

0

O wagę pliku wykonywalnego się nie martw. Trzeba naprawdę duuuuuużo napisać, żeby miało to jakiekolwiek znaczenie. Znacznie więcej zajmują zasoby. No chyba, że faktycznie korzystasz ze sporych bibliotek i statycznie dołączysz boosta, qt to dostaniesz 15-megowego exeka.

Funkcje nie są kopiowane, o ile nie są inline. Traci się za to szybkość na rzecz narzutu spowodowanym skokami. W rzeczywistości, w normalnych warunkach nie ma to również znaczenia. Nie ma na to złotego środka, ale staraj się dzielić kod w ten sposób, by był logicznie rozdzielony, ale w kwestii wyboru pomiędzy funkcją, a ctrl-c, ctrl-v nie ma się co zastanawiać ;).

0

Nie są kopiowane? słyszałem, że każde odwołanie do niej tj wstawienie w kodzie kodu funkcji

0

Tylko gdy są inline. W przeciwnym wypadku jest to odłożenie argumentów na stos i jeden call (potem ret i zdjęcie argumentów).

0

Zasada DRY (Don't Repeat Yourself) jest być może najważniejszą zasadą odnoszącą się do jakości kodu (a na pewno jedną z). Dlatego używaj funkcji (metod) zamiast kopiowania kodu. Co więcej, gdy masz jakąś długą i ciężką do ogarnięcia metodę, do dobrze jest podzielić jej kod na mniejsze metody z opisowymi nazwami, lub wykonać inną refaktoryzację (gdy metoda jest bardzo skomplikowana i ma wiele zmiennych tymczasowych, można wydzielić z niej klasę).

Czytelność i jakość kodu są obecnie dużo ważniejsze od wielkości exeków. Stawiaj je nawet przed wydajnością. Utrzymaj wysoką jakość kodu i wtedy sprawdź wydajność. Jeśli będzie zbyt niska, to użyj jakiegoś profilera i odnajdź punkty krytyczne programu -- fragmenty kodu, których wykonanie zajmuje najwięcej czasu. Zoptymalizuj je i olej pozostałe. Ponownie sprawdź wydajność. Jeśli wciąż nie będzie wystarczająca, to powtórz operację: zlokalizuj najwolniejsze fragmenty kodu (z tych, co zostały) i je zoptymalizuj

Podczas tych optymalizacji, jeśli wydajność jest krytyczna, może trochę ucierpieć jakość/czytelność kodu. Ale to powinno być tylko kilka krytycznych miejsc. Często ludzie piszą kod od razu z myślą o optymalizacji i traktują to jako usprawiedliwienie niskiej jakości/czytelności kodu. Oni robią bez sensu, bo zwykle około 90% z tych ich nieczytelnych optymalizacji nie ma praktycznie wpływu na szybkość działania aplikacji. Nie spotkałem się jeszcze z przypadkiem, by w większym programie więcej niż 10% kodu było krytyczne dla wydajności.

I koledzy oczywiście mają rację mówiąc, że funkcje nie są kopiowane w momencie ich wywoływania (chyba że są oznaczone jako inline). W ogóle dzisiaj wywołanie funkcji zajmuje bardzo mało czasu, więc nie należy się bać dodatkowych narzutów czasowych. A gdy masz jakąś mini funkcję, która jest wywoływana miliony razy w krytycznym fragmencie, to wtedy faktycznie koszt wywołania może być zauważalny (gdyby funkcja była duża, to by nie był -- wykonanie dużej funkcji trwa o wiele dłużej niż samo wywołanie [ang. function call]). W takim wypadku tę małą funkcję oznaczasz jako inline i wtedy prawdopodobnie jej treść będzie skopiowana przez kompilator tu i ówdzie, ale ponieważ funkcja jest mała, nie zwiększy to istotnie rozmiaru programu.

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