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ć?
Jak to blokada mutex poziom klasy na czas trwania duży plik-napisz drobnoziarnisty? –
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)? –