Bazı arka plan bilgileri vermek için, kaydedilmiş bir dosyayı işliyorum ve dosyayı bileşen nesnelerine bölmek için normal bir ifade kullandıktan sonra, nesnenin verilerini hangi nesne türüne göre işleme koymam gerekiyor.Küçük görevler için performans std :: async 'yi defalarca kullanabilir misiniz?
Şu andaki düşüncem, her nesnenin birbirinden bağımsız yüklenmesi gibi, bir miktar performans kazancı elde etmek için paralellik kullanmaktır. uygulamada 2'den fazla tipleri olacağına
void LoadFromFile(const std::string& szFileName)
{
static const std::regex regexObject("=== ([^=]+) ===\\n((?:.|\\n)*)\\n=== END \\1 ===", std::regex_constants::ECMAScript | std::regex_constants::optimize);
std::ifstream inFile(szFileName);
inFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
std::string szFileData((std::istreambuf_iterator<char>(inFile)), (std::istreambuf_iterator<char>()));
inFile.close();
std::vector<std::future<void>> vecFutures;
for(std::sregex_iterator itObject(szFileData.cbegin(), szFileData.cend(), regexObject), end; itObject != end; ++itObject)
{
// Determine what type of object we're loading:
if((*itObject)[1] == "Type1")
{
vecFutures.emplace_back(std::async(LoadType1, (*itObject)[2].str()));
}
else if((*itObject)[1] == "Type2")
{
vecFutures.emplace_back(std::async(LoadType2, (*itObject)[2].str()));
}
else
{
throw std::runtime_error("Unexpected type encountered whilst reading data file.");
}
}
// Make sure all our tasks completed:
for(auto& future : vecFutures)
{
future.get();
}
}
Not olun: Bu yüzden ben şöyle std::async
çağırarak sonra işleme ve olacağım her tür nesne için bir std::string
kabul eden bir LoadObject
işlevi tanımlamak için gidiyordu (bu sadece kısa bir örnektir) ve dosyadaki binlerce obje okunabilir.
Çok fazla iş parçacığı oluşturmanın, içerik anahtarlarından dolayı maksimum donanım eşzamanlılığını aştığında performans açısından genellikle kötü bir şey olduğunun farkındayım, ancak belleğimin doğru şekilde sunulması durumunda C++ çalışma zamanı oluşturulan iş parçacıklarının sayısını izlemelidir. ve std::async
'u uygun bir şekilde programlayın (Microsoft'un durumunda ConcRT kitaplıklarının bundan sorumlu olduğuna inanıyorum), bu nedenle yukarıdaki kod hala bir performans iyileştirmesiyle sonuçlanabilir?
Şimdiden teşekkürler!
Yukarıdaki kod * * performans sağlayan gerçektir sonucu, ama bağlı olduğunu söyleyebilirim olabilir:
bir yolu portably aslında çalışan kaç Konuları sınırlamak için Semafora gibi bir şey kullanmaktır Her LoadTypeX'in yaptığı iş miktarında. Başlamanız için başladığınız ek yükü başlatmak, beklemek ve senkronize etmek için yeterli mi? Önbellek kayıplarının ve sahte paylaşımların sayısından daha fazla bahsetmiyorum. Ve çok iş parçacıklı programlama ile ilişkili diğer cezalar. Yani, eğer nesneleriniz büyükse ve asenkron yük fonksiyonlarınız önemli bir iş yapıyorsa, muhtemelen buna değer olduğunu söyleyebilirim. Ama neden sadece ölçemiyorsun? – yzt
İlgisiz: 100 varsayılan yapılandırılmış bir futurestan oluşan bir vektör yaratıyorsunuz ve sonra gerçek geleceklerinizi sonuna ekliyorsunuz. Varsayılan olarak oluşturulmuş futures'larda get() 'yi çağırmak, tanımlanmamış davranışlarla sonuçlanır. – Casey
Kodunuzu belirlediniz mi? I/O maliyetini, işlem maliyetini, işlemin iş parçacığına bölünmesinden elde edilen kazancın ölçülebilir olmadığı noktaya kadar cüce beklerdim. –