2011-02-23 3 views
0

다음 코드 세그먼트가 있습니다. 크기가 176000 인 벡터의 경우 루프 실행까지 최대 8 분이 소요됩니다. 너무 많은 시간이 걸리는지 확실하지 않습니다.성능 튜닝

XEPComBSTR bstrSetWithIdsAsString; //Wrapper class for BSTR 
    std::vector<__int64>::const_iterator it; 
    for(it = vecIds.begin(); 
     it != vecIds.end(); 
     it++) 
    { 

        __int64 i64Id = (*it); 
        __int64 i64OID = XPtFunctions::GetOID(i64Id); 

        // set ',' between two set members 
        if (it != vecIds.begin()) 
         bstrSetWithIdsAsString.Append(XEPComBSTR(L",")); 
         wchar_t buf[20]; 
     _i64tow_s(i64OID, buf, 20, 10); 
     bstrSetWithIdsAsString.Append(buf); 
    } 


__int64 GetOID(const __int64 &i64Id) 
{ 
    __int64 numId = i64Id; 
    numId <<= 16; 
    numId >>= 16; 
    return numId; 
} 
+1

나는 보통 그것이해야한다고 생각하는대로 수행하지 않는 이유를 결정하기 위해 프로그램을 작성합니다 ... – justin

+1

상황에 따라 8 분? 최적화로 컴파일 중입니까? 어떤 컴파일러를 사용하고 있으며 MSVC의 경우 Secure STL 기능을 비활성화 했습니까? – jalf

+0

@jalf 최적화가 설정되지 않았습니다. VC9 –

답변

1

이 모든 시간을 차지하는 것을 알아내는 유일한 방법은 응용 프로그램을 프로파일하는 것입니다. Visual Studio의 일부 에디션에는 완전한 기능을 갖춘 프로파일 러가 있습니다.

또는 단순히 디버거에서 프로그램을 실행하고 임의의 간격으로 중단 한 다음 코드의 위치를 ​​기록하십시오.

하지만 내가 볼 수있는 몇 가지 잠재적 인 문제 명소 :

  • 당신은 문자열의 많은 추가 수행합니다. 매번 새로운 메모리를 할당합니까? std::string처럼 문자열 유형이 미리 메모리를 예약 할 수 있습니까? 일반적으로 문자열 클래스는 효율적입니까?
  • 반복자를 반복하고, 사용중인 끔찍한 헝가리 표기법을 사용하면 아마 MSVC를 사용하여 Windows에서 작업하고 있다고 가정합니다. MSVC의 일부 버전에서는 명시 적으로 해제하지 않는 한 릴리즈 빌드 에서조차도 STL 반복기에 대한 런타임 검사를 많이 수행 할 수 있습니다. VS2005 및 2008은 특히이 사실을 알고 있습니다. 2010에서는이 검사를 디버그 모드에서만 사용할 수 있습니다.
  • 그리고 물론 최적화가 활성화 된 건물입니다. 맞습니까?

그러나 나는 단지 그럴 수 있다고 생각하고 있습니다. 코드가 느려질 수 있습니다. 나는 실제로 일이 어떤 단서가 없습니다. 확실히하려면 코드를 프로파일 링해야합니다. 너 그렇게 할 수있어. 나는 할 수 없다. 그렇게해라.

2

병목 현상이 추가 기능이라고 생각합니다. 보시다시피 문자열은 할당 된 메모리를 내부에 가지고 있으며, 맞지 않는 것을 추가하려고하면 더 많은 메모리가 재 할당됩니다. 많은 시간이 걸립니다. 처음에 필요한 메모리를 한 번 할당하십시오. bstrSetWithIdsAsString.Append(buf);

하지만 나는 그것이를 찾아 버퍼의 끝마다이 곳을 작업하는 경우 특히, 속도 저하는 곳은 추측 : HTH

1

나는 이것이 무엇을하고 있는지 확실하지 않다 첫 번째 0 바이트, 그리고 아마도 많은 재 할당이 필요합니다.

wostringstream을 사용하지 않는 이유는 무엇입니까?