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