Sto scrivendo un'applicazione server che acquisisce dati da più origini contemporaneamente e le archivia nel suo database interno (attualmente un std::set
).Prestazioni del contenitore PPL
Ho appena esaminato le strutture dati PPL di ConcRT di Microsoft e mi sono chiesto come la loro efficienza si paragoni all'uso di un mutex a grana fine su un std::unordered_set
. Ad esempio, c'è molto di una differenza di prestazioni tra i due frammenti di codice:
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;
}
}
E:
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, ho spesso bisogno di stampare i dati al fine, che è il motivo per cui' m attualmente utilizzando std::set
rispetto a std::unordered_set
, quindi se c'è un vantaggio nell'uso di concurrency::concurrent_unordered_set
, il potenziale guadagno di prestazioni si avvicina al costo del riordino dei dati ogni volta che deve essere stampato?
Come è un blocco mutex livello di classe per la durata di un grande file-scrittura a grana fine? –
È difficile capire cosa stai cercando di ottenere qui. Il tuo primo esempio di codice blocca il mutex per l'intera durata della scrittura dell'intero set. cioè non è concomitante con il popolamento del set. Nel secondo esempio di codice, l'iteratore nel ciclo for è presumibilmente concorrente, quindi se il set veniva popolato mentre il ciclo for era in esecuzione, presumibilmente il ciclo for terminava solo se otteneva un blocco e si spostava prima del il thread di popolamento ha ottenuto un blocco per inserire un nuovo valore. Cosa stai cercando di ottenere? Lettura simultanea (da rete) scrittura (su disco)? –