1

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大型阵列没有这种开销?

4

1 回答 1

1

如果您考虑一下,使用函数会慢很多,因为

  1. 必须为返回值分配内存
  2. 当函数返回时,必须将数据复制到接收变量
  3. 临时内存必须被丢弃。

调用子程序时,只需将结果直接写入输出变量即可。

OOP 风格并不是要在函数中编写所有内容:这只是为了方便,以便阅读代码的人可以更容易地理解它。OOP 更多的是关于对象拥有数据并负责管理自己的数据。

于 2013-05-15T18:37:35.897 回答