Fortran 中 OOP 特性的标准线是它们有利于可读性和重用性,但不利于执行时间。当我测试它时,我得到了好坏参半的结果。
我编写了一个简单的虚拟程序,通过在派生类型中添加两个大数组来测试这一点。
type oop
real(8),allocatable,dimension(:,:,:) :: array
contains
procedure :: plusOOP,eqPlus
generic :: operator(+) => plusOOP
end type
type(oop) function plusOOP(a,b) result(c)
class(oop),intent(in) :: a,b
c%array = a%array+b%array
end function plusOOP
subroutine eqPlus(c,a,b)
class(oop),intent(in) :: a,b
class(oop),intent(inout) :: c
c%array = a%array+b%array
end subroutine eqPlus
我发现这call c%eqPlus(a,b)
与添加标准数组一样快。然而,这似乎比仅仅写作更清楚c%array = a%array+b%array
。不幸的是,c=a+b
对于值超过 1M 的数组,速度要慢两倍左右。(对于值小于 500K 的数组c=a+b
同样快,但这可能取决于特定的计算机。)
OOP 风格的真正问题是倾向于将所有内容编写为函数而不是子例程吗?有没有办法让c=a+b
大型阵列没有这种开销?