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
。不幸的是,对于具有超过1M值的数组,c=a+b
大约慢两倍。 (对于值小于500K的数组c=a+b
同样快,但这可能取决于具体的计算机。)
OOP风格的真正问题是将所有内容编写为函数而不是子例程的倾向吗?有没有办法让c=a+b
没有大数组的开销?
答案 0 :(得分:0)
如果你考虑一下,使用函数会慢很多,因为
1)必须为返回值分配内存 2)当函数返回时,必须将数据复制到接收变量 3)必须丢弃临时存储器。
调用子程序时,您需要做的就是将结果直接写入输出变量。
OOP风格不是在函数中编写所有东西:这只是为了方便,以便阅读代码的人可以更容易地理解它。 OOP更多地是关于拥有数据的对象,并负责管理自己的数据。