为了提供一些背景信息,我正在处理一个保存的文件,在使用正则表达式将文件拆分为其组件对象之后,我需要根据对象的类型来处理对象的数据。
我目前的想法是使用并行性来获得一点性能提升,因为加载每个对象是相互独立的。所以我要定义一个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();
}
}
请注意,应用程序中将有超过 2 种类型(这只是一个简短的示例),并且文件中可能有数千个要读取的对象。
我知道创建太多线程通常对性能不利,因为上下文切换导致它超过了最大硬件并发,但是如果我的记忆正确地为我服务,C++ 运行时应该监控创建的线程数量并std::async
适当地安排(我相信微软的情况是他们的 ConcRT 库对此负责?),所以上面的代码仍然可能导致性能提升?
提前致谢!