我希望像這樣的答案不用擔心,編譯器會照顧那個但我無法確定。Fortran的提領類屬性的速度
當我做一些方法在一些自定義的類型/類FORTRAN,有因引用/取消引用像this%a(i) = this%b(i) + this%c(i)
對象的字段比較擊中任何性能只使用數組一樣a(i) = b(i) + c(i)
更復雜例如:
例如我有這個函數應該在3D網格上內插一個真正性能至關重要的值(它會在另一個3D數組的三重循環內被調用)。所以我在考慮如果使用類的方法更好(性能),或者更確切地說,創建一個將該數組作爲參數的普通子例程。
type grid3D ! 3D grid maps of observables
real, dimension (3) :: Rmin, Rmax, Rspan, step ! grid size and spacing (x,y,z)
integer, dimension (3) :: N ! dimension in x,y,z
real, dimension (3,:, :, :), allocatable :: f ! array storing values of othe observable
contains
procedure :: interpolate => grid3D_interpolate
end type grid3D
function grid3D_interpolate(this, R) result(ff)
implicit none
! variables
class (grid3D) :: this
real, dimension (3), intent (in) :: R
real :: ff
integer ix0,iy0,iz0
integer ix1,iy1,iz1
real dx,dy,dz
real mx,my,mz
! function body
ix0 = int((R(1)/this%step(1)) + fastFloorOffset) - fastFloorOffset
iy0 = int((R(2)/this%step(2)) + fastFloorOffset) - fastFloorOffset
iz0 = int((R(3)/this%step(3)) + fastFloorOffset) - fastFloorOffset
dx = R(1) - x0*this%step(1)
dy = R(2) - y0*this%step(2)
dz = R(3) - z0*this%step(3)
ix0 = modulo(x0 , this%N(1))+1
iy0 = modulo(y0 , this%N(2))+1
iz0 = modulo(z0 , this%N(3))+1
ix1 = modulo(x0+1 , this%N(1))+1
iy1 = modulo(y0+1 , this%N(2))+1
iz1 = modulo(z0+1 , this%N(3))+1
mx=1.0-dx
my=1.0-dy
mz=1.0-dz
ff = mz*(my*(mx*this%f(ix0,iy0,iz0) &
+dx*this%f(ix1,iy0,iz0)) &
+dy*(mx*this%f(ix0,iy1,iz0) &
+dx*this%f(ix1,iy1,iz0))) &
+dz*(my*(mx*this%f(ix0,iy0,iz1) &
+dx*this%f(ix1,iy0,iz1)) &
+dy*(mx*this%f(ix0,iy1,iz1) &
+dx*this%f(ix1,iy1,iz1)))
end if
end function grid3D_interpolate
end module T_grid3Dvec
如果你關心你爲什麼不做出一些實驗,收集一些數據,這些問題?如果你想確定得到一些證據,不要依賴陌生人的斷言。 –
部分你是對的,但通過問我可以得到一些更廣泛的理解或建議,而不僅僅是觀察。 –
我懷疑可能有區別,你只是取消引用一個指針。 –