
Сообщение от
litwr
Код:
fib: cmp rax,2 ;in: rax; out: rcx
ja .l1
mov rcx,1
ret
.l1: dec rax
push rax
call fib
pop rax
push rcx
dec rax
call fib
pop rax
add rcx,rax
ret
Очень плохой пример. Я как раз посмотрел ассемблер, решил что надо оптимизировать обращения к памяти, а потом вообще пришел к выводу что алгоритм мусорный и пример "высосан из пальца". Для прикола я его на ARM-е запустил на 120МГц, оно тупо зависло, неудивительно - вызов функции осуществляется примерно 2^40 раз, жесть.
Вот на коленке за пару минут набросанная функция:
Код:
int fib (int n)
{
register int a, b, c;
if (n < 3) return 1;
a = b = 1;
n -= 2;
do
{
c = a + b;
a = b;
b = c;
}
while(--n);
return с;
}
Попробуйте что там компилятор нагенерит.
Update: я немного погорячился, там не 2^40 вызовов, но число вызовов представляет собой смещенный ряд Фиббоначи, и все равно значительное. Ваш пример у меня секунд 10 считал на довольно быстром i7.