2011-03-20 2 views
0

개별 입력 매개 변수가 큰 경우 함수가 많으며 프로그램 중에 함수가 수억 번 실행됩니다.함수에 대한 매개 변수 입력 최적화

이 함수를 최적화하려면 모든 입력 매개 변수를 보유하고 각 매개 변수를 함수에 개별적으로 전달하는 대신 참조로 함수에 전달하는 새 데이터 구조를 만들어야합니까? 아니면 컴파일러가 현명한 대우를 수행 할만큼 현명한 방법이기 때문에 중요하지 않습니까?

+0

컴파일러가 이러한 기능을 인라인하지 않으면 매우 놀랄 것입니다. 재귀 적입니까? – CromTheDestroyer

+0

거대한 5 중첩 된 루프 안의 재귀가 아니라 ... – Faken

답변

2

일반적으로 변수가 포함 된 데이터 구조를 전달하는 것이 좋습니다. 이 훨씬 좋네요

void f(int a, int b, int c, int d, int e, int f) 
{ 
    // do stuff 
} 

: 이것은 또는 사용보고 꽤하지 않습니다

void f(Params p) 
{ 
    // do stuff with p 
} 

참조로 패스를 수행 할 수 있습니다, 그래서 컴파일러는 객체에 대한 참조를 전달할 수 있습니다 , 전체 데이터 구조를 복사하지 마십시오. 실제 예를 들어 :

double distance(double x1, double y1, double z1, double x2, double y2, double z2) 
{ 
    double dx = x1 - x2; 
    double dy = y1 - y2; 
    double dz = z1 - z2; 

    return sqrt(dx*dx + dy*dy + dz*dz); 
} 

데이터하지만 구조로 우리의 (x, y, z)를 캡슐화 경우 더 나은 것 :

struct Point 
{ 
    double x; 
    double y; 
    double z; 
}; 

double distance(const Point &p1, const Point &p2) 
{ 
    double dx = p1.x - p2.x; 
    double dy = p1.y - p2.y; 
    double dz = p1.z - p2.z; 

    return sqrt(dx*dx + dy*dy + dz*dz); 
} 

많은 청소기 코드, 당신은 추가 보너스를 얻을 수 더 잘 수행 할 수 있습니다 (* 어느 버전을 최적화 할 때 컴파일러가 얼마나 똑똑한 지에 따라 다름).

분명히 이것은 실제로 달성하려는 내용에 따라 크게 다를 수 있지만 특정 상황에서 비슷한 사용법을 가진 변수가 여러 개 (4 개 이상)있는 경우에는 데이터 구조.

+0

음 ... 96 변수는 어때요? 이 함수는 수학 함수와 관련이 있습니다. – Faken

+0

96 개의 변수는 잘못된 동작을 나타냅니다. 정확히 뭐하고 있니? –

+0

변수는 왼쪽에서 오른쪽과 가운데에 있으며 함수가 내부에있는 거대한 루프를 기반으로 선택됩니다. 일반적으로 구조를 사용해야합니까? – Faken

1

인수가 거의 일정합니까? 아니면 대부분의 호출마다 변경됩니까? 한 번만 할 수 있다면 여러 번 평가할 필요가 없습니다.

컴파일러가 인수를 사용하여 수행하는 작업에 유의하십시오.

각각을 평가하여 스택에 푸시합니다. 그런 다음 함수가 입력되고 스택에서 오프셋을 기준으로 해당 인수를 참조합니다. 따라서 인수를 블록에 넣고 블록을 전달한 것과 기본적으로 같습니다. 그러나 블록을 직접 만들면 이전 값을 다시 사용할 수 있고 변경된 것으로 판단 할 수 있습니다.

어쨌든 함수에 인수를 전달하는 데 소요 된 시간에 비례하여 함수 내부에서 수행되는 작업의 양을 실제로 봐야합니다. 전반적인 시간 범위를 알지 못해도 10^8 번이라고 부르는 것은 중요하지 않습니다. 통화 당 10ns 또는 통화 당 10ms가 될 수 있습니다. 후자가 거의 모든 시간을 함수 내부에서 보냈다면, 아마도 여러분이 어떻게 호출했는지별로 차이가 없을 것입니다.

관련 문제