2011-02-04 1 views
1

유창한 인터페이스를 정의하는 것이 성능에 영향을 미칩니 까?

class Foo 
{ 
public: 
    void setA(int a) { m_a = a; } 
    void setB(int b) { m_b = b; } 
private: 
    int m_a, m_b; 
}; 

또한 "유창 인터페이스"방법을 사용하여 작성 될 수있다 : 지금

class Foo 
{ 
public: 
    Foo& setA(int a) { m_a = a; return *this; } 
    Foo& setB(int b) { m_b = b; return *this; } 
private: 
    int m_a, m_b; 
}; 

을이 클래스를 고려

의 의 :

난 그냥 나를 위해 또 다른 문제를 제기 this question를 읽고 , 만약 내가 다음과 같은 코드 스 니펫을 작성 :

int main() 
{ 
    Foo foo; 
    foo.setA(1); 
    foo.setB(2); 
} 

클래스의 두 번째 구현을 사용하여 추가 return 지시문에 의해 유도 된 성능 차이가 있습니까?

신경 써야할까요? (내 추측은 "아니오"입니다)

답변

0

메소드가 인라인되어 있기 때문에 컴파일러는 반환 값이 사용되지 않았는지 확인하고 가능하면 멀리 최적화해야합니다.

프로젝트 디자인에 가장 적합한 방법을 사용하십시오. 그런 다음 성능을 측정하고 코드를 최적화하는 것이 좋지 않은 경우에만 수행하십시오.

0

나는 컴파일러 최적화로 인해 차이가 없을 것이라고 생각합니다.

4

클래스의 두 번째 구현을 사용하면 추가 반환 지시문에서 성능 차이가 발생합니까?

잘 모르겠습니까? 컴파일러와 최적화 설정이 있습니까? 정확한 오버 헤드를 막을 수있는 방법은 없지만이 경우를 최적화하지 않은 밀교 플랫폼에 대해 순진하고 차선책의 컴파일러를 작성한다고 상상할 수 있습니다.

주어진 상황에서 문제가 있다고 생각한다면 test it instead of assuming.

+0

크 누스가 반복하기 때문에 +1. – Raedwald

0

2 구현이 사용되는 및 설정 기능의 반환 값이 필요하지 않은 경우, 컴파일러 또는 정적 분석기가 반환 불평하지 않도록

(void) foo.setA(1); 
    (void) foo.setB(2); 

로 작성하는 것이 더있을 수 있습니다 값이 사용되지 않습니다.

성능면에서 참조 을 반환하면 (확실하지 않습니다)은 첫 번째 구현과 비교하여 1/2 개의 추가 어셈블리 명령어를 생성하지만 "실제"차이가 없을 수 있습니다.

0

클래스를 정의한 방식에 따라 두 클래스 간의 차이점 (있는 경우)은별로 알 수 없습니다.당신이 조금 설계를 수정하는 경우에는, 당신은 것입니다 :

class Foo1 
{ 
public: 
    Foo1(int a, int b) : m_a(a), m_b(b) {} 
    void setA(int a) { m_a = a; } 
    void setB(int b) { m_b = b; } 
private: 
    int m_a, m_b; 
}; 

class Foo2 
{ 
public: 
    Foo& setA(int a) { m_a = a; return *this; } 
    Foo& setB(int b) { m_b = b; return *this; } 
private: 
    int m_a, m_b; 
}; 

Foo1 초기화 :

Foo1 f(1, 2); // only constructor called 

훨씬 더 효율적입니다 Foo2 초기화보다 : 어떤 경우에는

Foo2 b; // constructor called 
b.setA(1).setB(2); // 2 functions called 

, 그건 걱정거리가 아니야.

Fluent Interfaces에 대한 추가 관심사는 최종 사용자가 잘못 사용하는 것입니다. 인터페이스를 설계 할 때 인터페이스 사용자가 인터페이스를 손쉽게 분해 할 수 있도록 인터페이스를 설계하려고합니다. 모든 설정 기에서 참조를 반환하면 해당 참조를 저장 한 다음 객체를 이동하거나 할당을 취소하면 매달린 참조가 생깁니다 (실현되지 않을 수도 있음).

+0

훨씬 효율적입니까? 내 컴파일러는이 두 가지 경우 모두에 대해 정확히 동일한 코드를 생성합니다. 특히, Foo2의 생성자는 사소한 것임을 주목하십시오. –

+0

우리는 CPU 용어로 말하고 있습니다. 단일 생성자가

+0

항상 그렇지는 않습니다. [이 경우는 아닙니다] (예 : http://codepad.org/P9JhlUIl). –

0

이러한 종류의 성능 차이는 결코 중요하지 않습니다. 그러나 실제 응용 프로그램에 대한 측정을 잘못하면 나를 증명하십시오.