2013-06-17 20 views
6

Aynı anda birden fazla kaynaktan veri alan ve bunu dahili veritabanında (şu anda std::set) saklayan bir Sunucu uygulaması yazıyorum.PPL Kapsayıcı performansı

Sadece Microsoft'un ConcRT PPL veri yapılarına bakıyorum ve verimliliğinin std::unordered_set numaralı telefondan ince taneli bir mutex'i nasıl kullandığını merak ediyorum.

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

Ve: Örneğin, iki kod snippet'ine arasındaki performans farkının çok şey var

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, sık sık ben, bu yüzden de sırayla dışarı veri yazdırmak gerekiyor Şu anda std::unordered_set'un aksine std::set kullanıyorsunuz, bu nedenle concurrency::concurrent_unordered_set kullanımında bir kazanç varsa, potansiyel performans artışı, yazdırılması gereken her defasında verilerin yeniden sıralanması maliyetine yaklaşır mı?

+5

Nasıl süresince bir sınıf seviyesi muteksin kilit (fikri aynı tür coost veya TBB (intel eşzamanlı kapların eşzamanlı kuyruk) hangi may tüm kilit STL kapları daha hızlı olacaktır cinsinden) büyük dosya-yazma ince taneli? –

+0

Burada ne elde etmeye çalıştığınızı anlamak zor. İlk kod örneğiniz muteksin tamamını tüm setin dışına yazdırarak kilitler. yani kümeyi doldurmakla eş zamanlı değildir. İkinci kod örneğinizde, for döngüsündeki yineleyici muhtemelen eşzamanlı olarak güvenlidir, bu nedenle for döngüsü çalışırken set doldurulursa, muhtemelen for döngüsü bir kilit elde ederse sona erer ve daha önce sona erdirilir. Popülasyon ipliği yeni bir değer eklemek için bir kilit elde etti. Neyi başarmaya çalışıyorsun? Eşzamanlı okuma (ağdan) yazma (diske)? –

cevap

1

Evet, büyük bir fark var. Paralel yazma ve bu kapsayıcıdan 100 iş parçacığı çalıştırmayı deneyin ve farkı göreceksiniz.

PPL konteyner kilidi yok -> o daha hızlı olacaktır (muhtemelen çok özgür bekleyin veya iyileştirilmiş ayırıcısı kullanarak edilir iken STL değil bu allocator belirtilmişse hariç) tek iplik enrivronement olmasa da,

Kilidin tepesinin PPL konteynerinden birinden daha küçük olması mümkündür.