Un problema de tiempo fortran que no puedo entender
Escribí (para mi clase en Métodos numéricos para física teórica) un programa muy simple para una caminata aleatoria en la dimensión 2. Aquí está:
program random_walk
implicit none
integer, parameter :: Nwalker = 1000000
integer, parameter :: Nstep = 100
integer, parameter :: Nmeas = 10
integer :: posx, posy, move
integer :: is, im, iw
real :: start_time, stop_time
double precision, dimension(Nmeas) :: dist, r2
real :: rnd
do im = 1, Nmeas
dist(im) = im*Nstep
r2(im) = 0.0
end do
call cpu_time(start_time)
do iw = 1, Nwalker
posx = 0
posy = 0
do im = 1, Nmeas
do is = 1, Nstep
call random_number(rnd)
move = 4*rnd
if (move == 0) posx = posx + 1
if (move == 1) posy = posy + 1
if (move == 2) posx = posx - 1
if (move == 3) posy = posy - 1
end do
r2(im) = r2(im) + posx**2 + posy**2
end do
end do
r2 = r2 / Nwalker
call cpu_time(stop_time)
do im = 1, Nmeas
print '(f8.6, " ", f8.6)', log(dist(im)), log(r2(im))
end do
print '("Time = ", f6.3, " seconds")', stop_time - start_time
end program
Al final, debe imprimir 10 filas 2 columnas: la primera columna es el logaritmo del "tiempo" (número de pasos), la segunda columna es el logaritmo de la distancia cuadrada promedio desde el origen. La segunda columna "en promedio" debería ser igual a la primera. Hasta ahora todo bien, el programa funciona bien, los resultados son muy razonables. Pero aquí está el problema; en mi macbookpro (Intel Core i7 de 2,7 GHz, compilador gfortran 7.1.0, optimización -O2), en promedio, tarda más de 20 segundos en ejecutarse. Pero si comento estas líneas:
! do im = 1, Nmeas
! print '(f8.6, " ", f8.6)', log(dist(im)), log(r2(im))
! end do
que están más allá del cálculo de "stop_time", el resultado es que el tiempo de ejecución es ... ¡¡menos de 6 segundos !?
¿Como es posible?