2013-04-29 5 views
0

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)에 할당 할 수 이후

+0

프로세서에 많이 의존합니다. 직접 함수를 호출하려고 시도 했습니까? 요즘 컴파일러 작성자는 속도가 아닌 안정적으로 작동하도록 이러한 기능을 구현하는 방법에 중점을 둡니다. 이론 상으로는 동일한 기계 코드를 모두 최적화 할 수 있어야하지만, 현재 우리가 가지고있는 것은 아닙니다. –

+0

그래, 나는 그것과 다른 순열의 건강하지 못한 숫자를 시도했다 - 같은 요인은 더 느리다. 신뢰성에 대해 불평하지는 않을 것입니다. – weymouth

답변

0

, 기능을 사용하는 것이 훨씬 느려집니다 변수 3) 임시 메모리를 버려야합니다.

서브 루틴을 호출 할 때 출력 변수에 결과를 직접 작성하기 만하면됩니다.

OOP 스타일은 모든 기능을 작성하는 것이 아니라 코드를 읽는 사람이 쉽게 이해할 수 있도록 편의를위한 것입니다. OOP는 데이터를 소유하고 자신의 데이터를 관리하는 객체에 관한 것입니다.

+0

컴파일러는 일반적으로이 차이를 최적화 할 수 있습니다. –

+0

저는 C++, C#, Java 및 Delphi에서 정확히 동일한 성능 문제를 겪었 기 때문에 컴파일러 최적화, 특히 거대한 배열 또는 구조를 반환하는 함수에 대한 의문점을 가지고 있습니다. – cup

관련 문제