2013-06-17 2 views
6

나는 한 번에 여러 소스의 데이터를 가져 와서 내부 데이터베이스 (현재는 std::set)에 저장하는 서버 응용 프로그램을 작성 중입니다.PPL 컨테이너 성능

필자는 마이크로 소프트의 ConcRT PPL 데이터 구조를 살펴본 결과 std::unordered_set에서 세밀한 뮤텍스를 사용하는 것과 비교하여 효율성이 얼마나 높은지 궁금해했습니다.

void StdWithMutex(void) 
{ 
    std::ofstream outFile("Test.tmp"); 

    std::lock_guard<std::mutex> lockGuard(m_mutex); 

    // Iterate through the data and write it to a file: 
    // m_setData is of type std::unordered_set<DataType> 
    for(auto data : m_setData) 
    { 
      outFile << data; 
    } 
} 

그리고 : 예를 들어,이 개 코드 조각 사이의 성능 차이의 정도가

void ConcRT(void) 
{ 
    std::ofstream outFile("Test.tmp"); 

    // Iterate through the data and write it to a file: 
    // m_setData is of type concurrency::concurrent_unordered_set 
    for(auto data : m_setData) 
    { 
      outFile << data; 
    } 
} 

Moveover, 나는 종종 내가 '왜 어떤 순서로 데이터를 인쇄해야 m은 현재 std::unordered_set과 대조적으로 std::set을 사용하므로 concurrency::concurrent_unordered_set을 사용하면 얻게되는 이점이 있으면 인쇄 할 때마다 잠재적 인 성능 향상이 데이터를 재정렬하는 비용에 가깝습니까?

+5

이 방법의 기간에 대한 클래스 수준의 뮤텍스 잠금이다 (생각의 같은 종류의 coost 또는 TBB (인텔의 동시 컨테이너의 동시 큐) 할 수있는 모든 잠금 STL 컨테이너보다 빠른 것에서) 큰 파일 쓰기 세밀한? –

+0

여기서 달성하고자하는 것을 해결하는 것은 어렵습니다. 첫 번째 코드 예제는 전체 세트를 작성하는 전체 기간 동안 뮤텍스를 잠급니다. 즉, 집합을 채우는 것과 동시에 발생하지 않습니다. 두 번째 코드 예제에서 for 루프의 반복자는 아마도 동시 안전입니다. 따라서 for 루프가 실행되는 동안 집합이 채워진 경우 아마도 for 루프는 잠금을 얻은 경우에만 종료되고 populating thread는 새로운 값을 삽입하기 위해 잠금을 획득했습니다. 무엇을 성취하려고합니까? 동시 읽기 (네트워크에서) 쓰기 (디스크로)? –

답변

1

예 큰 차이가 있습니다. 100 개의 스레드를 병렬로 쓰고이 컨테이너에서 읽고 쓰는 것을 시도하면 차이점을 알 수 있습니다.

PPL 컨테이너를 고정하지 않습니다 -> 빠를 것이다 (아마 너무 자유를 기다리거나 개선 된 할당을 사용하는 반면, STL없는이 할당 지정한 경우는 제외) 단일 스레드 enrivronement 비록에서

을 잠금 장치의 오버 헤드가 PPL 컨테이너의 오버 헤드보다 작을 수 있습니다.