문제

가 런타임 성능이 저하면 인터페이스를 사용하여(추상 클래스)에서는 C++?

도움이 되었습니까?

해결책

짧은 대답:No.

긴 대답:그것은 기본 클래스 또는 숫자의 조상 클래스에서는 계층구조에 영향을 주는것은 속도입니다.유일한 것은 비용합니다.

비상 메소드 호출은 비용(지할 수 있는 인라인)
가상 메소드 호출에는 약간 높은 비용은 당신이 필요로하는 방법을 호출하기 전에 당신이 그것을 부(그러나 이것은 단순한 테이블보 검색).때문에 모든 방법을에는 가상 인터페이스에 의해 정의에 이용.

지 않는 한 당신이 쓰는 일부를 하이퍼 속도에 민감한 응용 프로그램 이를 실현하기 위해 해결해야 할 문제입니다.여분의 명확성을받을 것이다에서 인터페이스를 사용하여 일반적으로 한 모든 인식 속도는 감소합니다.

다른 팁

함수 호출을 사용하여 가상을 파견하지 않는 인라인

거기에 하나의 종류에 대한 벌금 가상 기능을 쉽게 잊:가상 통화를하지 않는 인라인서(일반)상황을 개체의 유형을 알고 있지 않은 컴파일때 정해진다.하는 경우 기능은 작은 적합한 인라인이 벌 수 있습니다 매우 중요한 대로,당신은 단지 추가의 오버헤드지만,컴파일러 또한 제한할 수 있는 방법을 제공하는 최적화 통화 기능(그것은 가정하는 가상 기능이 변경되었을 수 있는 일부 레지스터 또는 메모리 위치,그것을 전파할 수 없는 일정한 값 사이에는 발신자와 수신자가).

가상화 비용에 따라 달라집 플랫폼

으로 호출에 대한 오버헤드를 벌금에 비해 정상적인 함수 호출에 응답에 따라 귀하의 타겟 플랫폼입니다.만약 당신의 대상으로 하 PC x86/x64CPU,패널티를 위해 호출하면 가상 기능은 매우 작으로,현대 x86/x64CPU 수행할 수 있는지점 예측에 간접적인 호출합니다.그러나,대상으로 하는 경우에는 사용 또는 일부를 다른 RISC 플랫폼,가상화 처벌될 수 있 매우 중요하기 때문에,간접적화되지 않 예측에 어떤 플랫폼(Cf. PC/Xbox360 크로스 플랫폼 개발의 성공 사례).

거기에 작은 벌당 가상 함수 호출에 비해 일반 호출합니다.당신은 가능성이 차이가 관찰을 하지 않는다면 수백 수천의 전화당 두 번째로,가격은 종종 지불하는 가치가있을 위한 추가 코드를 명확성 anyway.

를 호출할 때 가상의 기능(예를 통해서 인터페이스)프로그램 할 수 있는 모습까지의 기능에는 표를 참조하여 함수를 호출한 객체입니다.이 작은 벌금에 비교하여 직접 전화하는 기능입니다.

또한,를 사용하면 가상 기능을 컴파일할 수 없는 인라인 함수 호출합니다.따라서 수 있는 벌금을 사용하여 가상의 기능에 대한 몇 가지 작은 기능입니다.이것은 일반적으로 가장 큰 성과"hit"가능성이 있습니다.이것은 정말만 하는 경우 문제가 기능은 작고 많은 시간을 말한 루프 안에서.

또 다른 대안 적용되는 일부 경우에는 컴파일시 다형성과 함께 템플릿이 있습니다.그것은 유용하는 경우,예를 들어,당신은 원 을 구현의 시작 부분에서 선택 프로그램 다음 사용 기간 동안 실행됩니다.예제 런타임을 다형성

class AbstractAlgo
{
    virtual int func();
};

class Algo1 : public AbstractAlgo
{
    virtual int func();
};

class Algo2 : public AbstractAlgo
{
    virtual int func();
};

void compute(AbstractAlgo* algo)
{
      // Use algo many times, paying virtual function cost each time

}   

int main()
{
    int which;
     AbstractAlgo* algo;

    // read which from config file
    if (which == 1)
       algo = new Algo1();
    else
       algo = new Algo2();
    compute(algo);
}

같은 사용하여 컴파일 시간이 다형성

class Algo1
{
    int func();
};

class Algo2
{
    int func();
};


template<class ALGO>  void compute()
{
    ALGO algo;
      // Use algo many times.  No virtual function cost, and func() may be inlined.
}   

int main()
{
    int which;
    // read which from config file
    if (which == 1)
       compute<Algo1>();
    else
       compute<Algo2>();
}

나는 생각하지 않는 비용 비교 사상 함수 호출 스트레이트 함수 호출합니다.을 생각하는 경우 사용에 대한 추상적인 기본 클래스(인터페이스),당신은 당신이 원하는 상황을 수행 중 하나 여러 가지 작업반의 동적인 유형의 객체입니다.당신은 선택을 해야합니다.하나 옵션이 사용 가능합니다.또 다른 스위치에는 개체의 유형 중에 나온(잠재적으로 비싼),또는 추가 유형()메소드를 기본 클래스(잠재적으로 증가하고 메모리의 사용은 각 개체).그래서 비용의 가상 함수 호출해야 합니다 비용을 대체하지 않는 비용의 일을 아무것도 아니다.

대부분의 사람들은 참고 런타임 패널티,또한 그렇게 하는 것이 맞습니다.

그러나,내 근무 경험에 큰 프로젝트에서 이득을 명확한 인터페이스하고 적절하게 캡슐화하는 빠르게 이득 오프셋에서 속도입니다.모듈 코드 교환될 수 있습 만족도를 향상시키기 위해 구현,그래서 그 결과는 큰 이득이다.

당신의 마일이 다를 수 있습니다,그리고 그것을 명확하게 응용 프로그램에 따라 달라집 당신이 개발하고 있습니다.

하나는 것을 주목해야한다는 가상 함수 호출에 비용이 달라질 수 있는 하나의 플랫폼에서 다른 있습니다.콘솔에서 그들 수 있습니다 더 눈에 띄는,일반적으로 vtable 전화 의미 캐시 놓치지할 수 있는 스크류 분기 예측.

참고하는 여러 상속풀리는 객체를 인스턴스는 여러 vtable 포인터입니다.G++x86 하는 경우,클래스에는 가상 방법과 기본 클래스,당신은 하나의 포인터를 vtable.이 있는 경우 하나의 기본 클래스로 가상적 방법으로,당신은 여전히 하나의 포인터를 vtable.두 개 있는 경우 기본 클래스에 가상 방법은,당신은 당신 두 개의 vtable 포인터 에 각각의 인스턴스.

따라서,여러 상속(는 무엇을 구현하는 인터페이스에서는 C++다),당신이 지불하는 기본 클래스가 시 포인터 크기의 객체를 인스턴스의 크기입니다.의 증가는 메모리 사용할 수 있는 간접적인 성능에 영향을 줍니다.

를 사용하여 추상적인 기본 클래스에서는 C++일반적으로 의무의 사용상 함수 테이블,귀하의 모든 인터페이스를 통화가 될 것을 보았을 통해하는 테이블.비용을 원 함수 호출,그래서 당신이해야 할 것보다 더 빨리하기 전에 그것에 대해 걱정 합니다.

유일한 주요한 차이가 나는 알고 있는 그 이후 당신이 사용하지 않는 콘크리트 클래스,인라인(훨씬?) 열심히 할 수 있다.

네트워크가 필요하지 않습니다 생각하는 가상 방법은 약간 느리게 전화를 보다 비상 메이기 때문에,전화를 통해 이동합 가상의 방법이블.

그러나,이것은 나쁜 이유를 망치는 디자인이다.필요하신 경우 더 높은 성능을 사용하여 더 빠른 서버입니다.

모든 클래스를 포함하는 가상 기능,vtable 이 사용됩니다.물론,호출하는 방법을 통해 전달 메커니즘처럼 vtable 보다 느리게 직접적인 통화,그러나 대부분의 경우에 당신할 수 있습니다.

네,하지만 아무것도 주목할 만하는 나의 지식이다.성능 칠 때문에'간접 있는 각 방법에서 호출합니다.

그러나,그것은 정말에 따라 컴파일러를 사용하기 때문에 일부의 컴파일러가지할 수 있는 인라인 메소드를 호출에는 클래스를 상속에서 추상적인 기본 클래스입니다.

당신이해야 할 실행해야 합니다.

네,있다.무언가를 수 있는 성능을 개선에 당신 플랫폼을 사용하는 것이 아닌 추상 클래스와 기능이 있다.다음 사용하 멤버 함수 포인터이하의 비가상 기능입니다.

나는 그것 기타 관점,그러나도 언급은 이 문제는 나에게 있다는 생각을 넣는 방법을 너무 많이 생각으로 클래스는 구조입니다.나는 본 적이 많은 시스템었던 방법으로 너무 많은"추상화 수준",그리고 혼자 만들어하는 경향이 심각한 성능 문제 때문에 비용의 메소드를 호출하지만,때문에 경향을 만들 수 있습니다.이 경우 통해 여러 수준,그것은 살인자입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top