【发布时间】:2013-04-29 16:14:31
【问题描述】:
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 没有大型数组的这种开销?
【问题讨论】:
-
它将很大程度上依赖于处理器。您是否也尝试直接调用该函数?如今,编译器作者专注于如何实现这些东西以可靠地工作,而不是速度。理论上它应该能够将两者优化为相同的机器代码,但它不是我们现在所拥有的。
-
是的,我试过了,还有很多其他排列不健康——同样的因素更慢。不过,我不会抱怨可靠性。
标签: oop fortran fortran2003