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>