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 값을 초과하는 어레이의 경우 2 배 정도 느립니다. (500KB 미만의 값을 가진 배열의 경우
c=a+b
도 빠릅니다. 그러나 이것은 특정 컴퓨터에 따라 다를 수 있습니다.)
OOP 스타일의 실제 문제는 모든 것을 서브 루틴 대신 함수로 쓰는 경향이 있습니까? 큰 배열에 대해이 오버 헤드가없는 c=a+b
을 얻을 수있는 방법이 있습니까? 당신이 그것에 대해 생각하는 경우
1) 메모리 함수가 반환, 데이터가 수신에 복사 할 수있다 반환 값 2)에 할당 할 수 이후
프로세서에 많이 의존합니다. 직접 함수를 호출하려고 시도 했습니까? 요즘 컴파일러 작성자는 속도가 아닌 안정적으로 작동하도록 이러한 기능을 구현하는 방법에 중점을 둡니다. 이론 상으로는 동일한 기계 코드를 모두 최적화 할 수 있어야하지만, 현재 우리가 가지고있는 것은 아닙니다. –
그래, 나는 그것과 다른 순열의 건강하지 못한 숫자를 시도했다 - 같은 요인은 더 느리다. 신뢰성에 대해 불평하지는 않을 것입니다. – weymouth