Jak nie uczyć programowania II
Pisałem już o tym, ale dziś trafiłem na przypadek skrajnego debilizmu ze strony wykładowcy…
Rekurencja choć pozwala na rozwiązanie wielu problemów w prosty sposób sama w sobie jest niewydajna. Związane są z nią problemy takie jak brak przypadku bazowego, brak możliwości predykcji liczby wywołań i tym samym konieczność tworzenia skoków w kodzie maszynowym, trudne testowanie. Pan wykładowca, niech go siedziba w Redmond pochłonie, wymyślił jeszcze, że dodamy tu obsługę za pomocą wyjątków… Cóż…
Ok, w C++ to zadziała z tego prostego powodu, że nie mam tam ścisłej kontroli jeśli chodzi o przechwytywanie wyjątków. W javie każdy wyjątek musi być przechwycony. W odpowiedzi na post zamieściłem przykładowy kod. Poniżej program, który testuje szybkość wykonania zadania. Do testów przyjąłem 10mln przejść przez rekurencyjny program. W pierwszym wypadku wywołujemy wyjątek w drugim nie mamy wyjątku:
Listing 1. Dlaczego wyjątki w Javie to zło?
import java.util.Date;
public class App {
private static final int ILOSC_PRZEBIEGOW = 10000000;
/**
* @param args
*/
public static void main(String[] args) {
App app = new App();
Date date = new Date();
for (int i = 0; i
<p>Wyniki na mojej maszynie to odpowiednio 29953 dla obsługi wyjątków i 297 dla czystego kodu. Czy ja dobrze widzę... dwa rzędy wielkości różnicy... daje do myślenia... no, ale "pan wykładowca" robi pewno doktorat i myśli, że jest tru i tebest.</p>