当我意识到一条线占用了大量时间时,我正在编写代码。这是一个简化版本(该行由!*表示)
program main
implicit none
real*8, allocatable :: x(:), y(:), f(:)
real*8 :: one, two, six, alpha, sigma, eps, m, n, r2, r, ff, start, finish, rr
integer*8 :: q, i, j
q = 10000
one = 1.
two = 2.
six = 6.
alpha = 4.
n = 12.
m = 6.
eps = 5.
sigma = 1.
rr = 2.1234567654324556
allocate(x(q), y(q), f(q))
call RANDOM_NUMBER(x)
call RANDOM_NUMBER(y)
f(:) = 0.
call CPU_TIME(start)
do i=1,q
do j=i+1,q
r2 = (x(i)-x(j))**two+(y(i)-y(j))**two
ff = six*alpha*eps*(one/r2*(sigma**m/(r2**(m/two))-two*sigma**n/(r2**(n/two))))
r = -(x(i)-x(j))*ff
f(i) = f(i) + r !*
end do
end do
call CPU_TIME(finish)
print*, finish-start
end program main
运行此代码所需的时间大约为10秒,但如果您在r
指示的行中使用rr
更改!*
,则时间将为0.01。
有谁能解释一下? r
和rr
之间有什么区别real*8
?
我正在使用Windows 8.1,Visual Studio 12 Ultimate,Intel Composer XE 2013和-O2
标志。
答案 0 :(得分:3)
将评论转换为答案......
如果你在标记的行中rr
而不是r
,那么该循环的所有计算都是无关紧要的,编译器可以将它们优化掉。我的猜测是,这会带来性能提升"你看。
此外,您在循环中执行的大多数计算都不依赖于x和y。您可以轻松地预先计算它们。另请注意(根据编译器的智能),x**2
比x**2.0
快。