Следующий код на моей машине (Core2Duo 1.83Ghz, L2 cache 2Mb, ram 2Gb) с ключами запуска "-ea -Xmx256m -Xss64m" выдает:
1.751140997 sec
0.216811633 sec
Рекурсия работает очень медленно. Что с ней не так?
public class DoYouWantToSeeSomeMagic {
static class List {
List next;
public List(List next) {
this.next = next;
}
}
private static List createListSlow(int n) {
if (n == 0) {
return new List(null);
} else {
return new List(createListSlow(n - 1));
}
}
private static List createListFast(int n) {
List[] list = new List[n + 1];
list[0] = new List(null);
for (int i = 1; i <= n; ++i) {
list[i] = new List(list[i - 1]);
}
return list[n];
}
public static void main(String[] args) {
final int N = 1 << 20;
{
long time = System.nanoTime();
createListSlow(N);
System.err.println((System.nanoTime() - time) / 1e9 + " sec");
}
{
long time = System.nanoTime();
createListFast(N);
System.err.println((System.nanoTime() - time) / 1e9 + " sec");
}
}
}
Если я изменяю N на (1 << 19) то результат:
0.129561439 sec
0.129751965 sec
n = 1 << 20
2.590676143 sec
0.266981001 sec
n = 1 << 19
0.176323427 sec
0.185077734 sec
Смех, да и только. Может, опять виновата разрядность?
Вывод - это опять приколы оптимизатора. Возможно, он умудряется развернуть рекурсию, но иногда у него это не получается.
Кстати, под 64-битной серверной JVM с настройками по умолчанию и достаточно глубокой рекурсией в случае "тормозного" выполнения можно легко слопать всю память и своп. Так что осторожнее.
I'm not sure which one "m" stands for, thats why I said it was just a guess :)