剧透:测试程序没有对结果进行任何操作,因此优化编译器删除了循环的内容,因此每次运行循环都需要花费相同的时间...无论如何,我会保留问题和答案,以防有人(包括我自己?)再次犯同样的错误。
原始帖子: 我想测试计算平方根与简单加法相比慢多少,于是写了下面这个小程序。结果表明,在这种情况下,它需要大约相同的时间,即0.3秒。这是怎么回事?
program sqtest
implicit none
real r, s
integer i,j,n, sq, t
sq=11
n=100000000
r=1.11
if (sq==1) then
do i = 1,n
s = sqrt(float(i)*r)
enddo
write(*,*) "squareroot"
else
do j = 1,n
t = j+4
enddo
write(*,*) "plus"
endif
end program
将sq=1
赋值给变量,以使用平方根。平方根循环同时进行乘法操作并将int
转换为float
。
objdump -d
)以确保编译器生成了你期望的代码。在这种情况下,我相信编译器删除了do循环,因为结果没有被使用。你最终应该执行s = s+sqrt(float(i)*r)
并在循环后打印值,以避免代码被删除。此外,从int到float的转换是昂贵的,你应该可能要做i_float = 0. ; do i=1,n ; i_float = i_float + 1. ; ...
来避免转换。 - Anthony Scemama