2013-06-17 3 views
6

Ich schreibe eine Server-Anwendung, die Daten aus mehreren Quellen gleichzeitig nimmt und speichert es in seiner internen Datenbank (derzeit eine std::set).PPL Container Leistung

Ich habe gerade die ConcRT PPL-Datenstrukturen von Microsoft untersucht und frage mich, wie ihre Effizienz mit der Verwendung eines feinkörnigen Mutex auf einem std::unordered_set vergleicht. Zum Beispiel ist es viel von einem Performance-Unterschied zwischen den beiden Code-Schnipsel:

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

Und:

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, muss ich oft die Daten aus, um drucken, weshalb ich m verwendet derzeit std::set im Gegensatz zu std::unordered_set, also, wenn es einen Gewinn bei der Verwendung von concurrency::concurrent_unordered_set gibt, würde die potenzielle Leistungssteigerung in der Nähe der Kosten für die Neuanordnung der Daten jedes Mal, wenn es gedruckt werden muss?

+5

Wie eine Mutex-Sperre für die Dauer von einer Klassenstufe ist große Datei schreiben feinkörnig? –

+0

Es ist schwierig herauszufinden, was Sie hier erreichen wollen. Ihr erstes Codebeispiel sperrt den Mutex für die gesamte Dauer des Schreibens des gesamten Satzes. d.h. es ist nicht gleichzeitig mit dem Auffüllen des Satzes. In Ihrem zweiten Codebeispiel ist der Iterator in der for-Schleife vermutlich gleichzeitig sicher. Wenn also der Satz während der Ausführung der for-Schleife gefüllt wurde, würde die for-Schleife vermutlich nur enden, wenn sie eine Sperre erhalten hätte Populations-Thread hat eine Sperre erhalten, um einen neuen Wert einzufügen. Was versuchst du zu erreichen? Gleichzeitiges Lesen (vom Netzwerk) schreiben (auf Platte)? –

Antwort

1

Ja, es gibt einen großen Unterschied. Versuchen Sie, aus diesem Container 100 Threads parallel zu schreiben und zu lesen, und Sie werden den Unterschied sehen.

der PPL Behälter nicht gesperrt -> es wird schneller seine (es ist wahrscheinlich auch frei warten, oder ein verbessertes allocator verwenden, während STL nicht außer wenn Sie dieses allocator angegeben)

In einzelnem Thread enrivronement obwohl Es ist möglich, dass der Overhead des Schlosses kleiner ist als der des PPL-Containers.

(in der gleichen Art von Idee der gleichzeitige Warteschlange von coost oder gleichzeitig Containern von TBB (Intel) wird schneller sein als STL-Container, die können all Sperre)