2013-06-17 8 views
6

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?

+5

Come è un blocco mutex livello di classe per la durata di un grande file-scrittura a grana fine? –

+0

È 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)? –

risposta

1

Sì, c'è un'enorme differenza. Prova ad eseguire 100 thread in parallelo scrivendo e leggendo da questo contenitore e vedrai la differenza.

contenitore PPL non blocca -> sarà più veloce (probabilmente è aspettare libero anche, o utilizzando un migliore allocatore, mentre STL non tranne se è stato specificato l'allocatore)

In single enrivronement filo, anche se è possibile che il sovraccarico del blocco sia inferiore a quello del contenitore PPL.

(nello stesso tipo di idea coda concomitante di coost o contenitori concorrenti di TBB (Intel) sarà più veloce di contenitori STL, che possono tutti serratura)