我有一个程序可以多次运行这样的函数:
int main(){
std::ifstream file(inFile);
std::string input;
while(std::getline(file, input)){
myFunction(input);
}
return 0;
}
myFunction(std::string){
//some work
}
我使用boost创建一个线程池来在多个线程上运行该函数,因为它们的行为非常适合这样的并行化:
int main(){
std::ifstream file(inFile);
std::string input;
/*Creating the thread pool and intializing the threads*/
boost::asio::io_service io_service;
boost::asio::io_service::work work_(io_service);
boost::thread_group threads;
for (std::size_t i = 0; i < NUMTHREADS; ++i)
threads.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
while(std::getline(file, input)){
io_service.post(boost::bind(&myFunction, input));
}
io_service.stop();
threads.join_all();
return 0;
}
myFunction(std::string){
//some work
}
我只添加了主要部分的代码片段。我得到了正确的输出,但这根本没有改善性能!我得到的运行时间与顺序运行相同。
我怀疑这些作业未正确提交到游泳池,但我该如何检查呢?
更新
我能够调查多个线程并检查工作是否正确提交,看起来每个线程都有自己的工作,但性能仍未改变。
答案 0 :(得分:0)
如果您以同步方式从多个线程读取相同的文件(这是因为您正在使用std流),没有任何意义,因为所有文件读取调用都将由系统序列化(这就是系统如何处理文件)。
可能,如果您使用异步文件读取(如IO完成),它将帮助您获得性能(如果您的工作执行所花费的时间比读取文件要多得多)。
但是,请记住,如果您从文件中读取内容的有用工作与读取操作相当,您将无法获得任何收益(但管理线程需要额外的成本和复杂性) ,上下文切换和同步)因为系统会对您的IO请求进行排队,并且它们将以串行方式执行(除非您从多个不同的物理驱动器读取)。