2013-06-17 14 views
6

Piszę aplikację serwera, która pobiera dane z wielu źródeł jednocześnie i przechowuje je w swojej wewnętrznej bazie danych (obecnie jest to std::set).PPL Pojemność wydajność

Właśnie przyglądałem się strukturom danych ConcruT PPL Microsoftu i zastanawiałem się, jak ich efektywność porównuje się z użyciem drobnoziarnistego muteksu na std::unordered_set. Na przykład, istnieje duża różnica wydajności pomiędzy dwoma fragmenty kodu:

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; 
    } 
} 

oraz:

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, często trzeba wydrukować dane w kolejności, która jest dlaczego ja” m obecnie używają std::set w przeciwieństwie do std::unordered_set, więc czy jest jakaś korzyść z używania concurrency::concurrent_unordered_set, czy potencjalny wzrost wydajności byłby zbliżony do kosztu zmiany kolejności danych za każdym razem, gdy trzeba go wydrukować?

+5

Jak to blokada mutex poziom klasy na czas trwania duży plik-napisz drobnoziarnisty? –

+0

Trudno jest ustalić, co próbujesz osiągnąć tutaj. Twój pierwszy przykład kodu blokuje muteks przez cały czas wypisywania całego zestawu. tj. nie jest współbieżne z wypełnianiem zestawu. W twoim drugim przykładzie kodu, iterator w pętli for jest przypuszczalnie równoczesny bezpieczny, więc jeśli zestaw był zapełniany, podczas gdy pętla for była uruchomiona, prawdopodobnie pętla for zakończyłaby się tylko wtedy, gdyby uzyskała blokadę i przesunęła się do końca przed wypełnienie wątku uzyskało blokadę do wstawienia nowej wartości. Co próbujesz osiągnąć? Współbieżny odczyt (z sieci) zapisu (na dysk)? –

Odpowiedz

1

Tak, jest ogromna różnica. Spróbuj uruchomić 100 wątków podczas równoległego zapisu i odczytu z tego kontenera, a zobaczysz różnicę.

pojemnik PPL nie blokuje -> to będzie szybciej (jest to prawdopodobnie czekać zbyt wolne, albo za pomocą ulepszonego przydzielania, natomiast STL nie wyjątkiem, jeśli określono ten przydzielania)

W pojedynczym enrivronement wątku, chociaż możliwe jest, że narzut blokady jest mniejszy niż kontener PPL.

(w tym samym rodzaju pomysł równoczesne kolejka coost lub równoczesnych pojemnikach TBB (Intel) będzie szybsze niż kontenerów STL, który może wszystko lock)