Чтобы предоставить некоторую справочную информацию, я обрабатываю сохраненный файл, и после использования регулярного выражения для разбиения файла на его объекты-объекты мне необходимо обработать данные объекта на основе того, какой тип объекта он есть.
Моя нынешняя мысль состоит в том, чтобы использовать parallelism, чтобы получить немного прироста производительности, так как загрузка каждого объекта не зависит друг от друга. Поэтому я собирался определить функцию LoadObject
, принимающую std::string
для каждого типа объекта, который я буду обрабатывать, а затем вызывая std::async
следующим образом:
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();
}
}
Обратите внимание, что в приложении будет более двух типов (это был только короткий пример) и потенциально тысячи объектов в файле, который нужно прочитать.
Я знаю, что создание слишком большого количества потоков часто является плохим для производительности, когда оно превосходит максимальное аппаратное обеспечение concurrency из-за контекстных переключателей, но если моя память служит мне правильно, среда выполнения С++ должна отслеживать количество потоков создал и запланировал std::async
соответствующим образом (я полагаю, что в случае Microsoft их библиотека ConcRT несет ответственность за это?), поэтому приведенный выше код может по-прежнему приводить к улучшению производительности?
Спасибо заранее!