왜 내 C++응용 프로그램을 빠르게 보다 나의 C 응용 프로그램(를 사용하여 동일한 라이브러리)에 Core i7

StackOverflow https://stackoverflow.com/questions/2054477

문제

나는 라이브러리에서 나는 2 으로 작성된 응용 프로그램에서는 C++과 C이 라이브러리는 커뮤니케이션 라이브러리,그래서 하나의 API 를 호출을 다음과 같습니다:

int source_send( source_t* source, const char* data );

에서 C 응용 프로그램 코드가 다음과 같다:

source_t* source = source_create();
for( int i = 0; i < count; ++i )
    source_send( source, "test" );

같은 곳에서는 C++응용 프로그램이:

struct Source
{
    Source()
    {
        _source = source_create();
    }

    bool send( const std::string& data )
    {
        source_send( _source, data.c_str() );
    }

    source_t* _source;
};

int main()
{
    Source* source = new Source();
    for( int i = 0; i < count; ++i )
        source->send( "test" );
}

에서 Intel Core i7C++코드를 생산하는 거의 50%이상의 메시지를 초당..반면에서 Intel Core2Duo 생산하는 거의 동일한 금액을 초당 메시지.(Core i7 은 4 개의 중핵을 가진 2 처리 각 스레드)

저는 호기심이 어떤 종류의 마법의 하드웨어를 수행합이다.나는 몇 가지 이론은 그러나 내가 생각 나는 것을 대답:)

편집:추가 정보를 댓글

컴파일러 visual C++,그래서 이것은 windows 상자(그들 모두)

구현 통신의 라이브러리를 새로 생성 스레드 메시지를 보낼.이 source_create 은 무엇을 만들이 스레드가 있습니다.

도움이 되었습니까?

해결책

검사에서 귀하의 소스 코드를 혼자를 볼 수 없습니다 왜 이유는 C++코드를 빠르게 할 수 있습니다.

다음으로 할 것이 확인 어셈블리 코드를 생성하는 중입니다.를 사용하는 경우에는 GNU toolchain,당신은 작업을 수행하는 몇 가지 방법이다.

요청할 수 있습니다 gcc 는 g++을 출력하는 어셈블리 코드를 통해 -S 명령줄 인수입니다.는지 확인하는 다른 추가하는 인자를 사용하여 동일한 명령이 하시는 일반적인 컴파일.

두 번째 옵션이드 프로그램으로 gdb 를 사용 disas 명령입니다.

행운을 빕니다.

업데이트

당신이 할 수 있는 동일한 것으로 Microsoft 툴체인.

을 얻을 컴파일러를 출력하는 어셈블리 중 하나를 사용할 수 있습니다 /FA 또/FAs.첫 번째 출력해야만 어셈블리는 두 번째 것입니다 섞 어셈블리는 원본(해야 그것을 만들이 쉽게 따라).

으로 사용하여 디버거,면 디버거에서 시작 시각,스튜디오로 이동하"Debug|Windows|해체"(에 대한 확인 Visual Studio2005,다른 버전이 다를 수 있음).

다른 팁

전체 코드 나 어셈블리를 보지 않으면 서 C ++ 컴파일러가 당신을 위해 무너지고 있다는 것입니다. C ++ 컴파일러의 미녀 중 하나는 속도를 위해 거의 모든 것을 인라인 할 수있는 능력이며, Microsoft의 컴파일러는 거의 불합리하게 부풀어 오른 최종 실행 파이브의 시점까지 거의 인라인으로 잘 알려져 있습니다.

내가 추천하는 첫 번째 일은 두 버전 모두 프로파일을 프로필하고 눈에 띄는 차이가 있는지 확인하는 것입니다.

C 버전은 불필요하게 무언가를 복사하는 것입니다 (반환 값 최적화와 같이 미묘하거나 미묘한 최적화가 될 수 있습니다).

더 높은 엔드 대 SKU가 있다면 샘플링 기반 프로파일 러가 좋은 프리 프로파일 러를 찾고 있다면 Windows Performance Analyzer는 Vista and Up에게 엄청나게 강력합니다. 스택 워킹 옵션 사용에 대한 연습이 있습니다

내가 아마도 가장 먼저 할 일은 디버거에 들어가서 분해를 검사하여 눈에 띄게 다른지 확인하는 것입니다. 참고 ASM을 텍스트 파일에 뱉어내는 컴파일러 옵션이 있습니다.

눈에 띄게 명백한 것이 없다면 (여분의 사본과 같이) 프로필로 이것을 따라갈 것입니다.

한 가지 더, 하이퍼 스레드가 방해가되는 것에 대해 걱정한다면, 프로세스를 비 HT 코어로 간단하게 단단하게 만듭니다. GUI의 작업 관리자 또는 SetThreadaffinityMask를 통해이를 수행 할 수 있습니다.

-약간 뒤틀리게 하다

코어 i7은 하이퍼 스레드 - HT 활성화가 있습니까?

C ++ 코드는 어떻게 든 HT를 활용하기 위해 컴파일되었지만 C 코드는 그렇지 않습니다. 코드를 실행할 때 작업 관리자는 어떻게 생겼습니까? 코어가 몇 개에 걸쳐 하중을 고르게 퍼뜨렸거나 최대가 몇 개가 있습니까?

단지 거친 추측 : 애플리케이션과 함께 라이브러리 소스를 컴파일하는 경우 C API 기능이 "C"라고 선언되지 않은 경우 C ++ 버전이 다르고 더 빠른 통화 컨벤션을 사용하고있을 수 있습니다.

또한 애플리케이션과 함께 라이브러리 소스를 컴파일하는 경우 C ++ 컴파일러가 라이브러리 소스를 C ++로 컴파일하고 C 컴파일러보다 최적화하는 것이 더 좋습니다.

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