2017-03-17 71 views
0

我有它运行的函数多次这样的程序:性能是一样的连续运行

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 
} 

我已经添加了仅主要部分的代码片段。我得到了正确的输出,但这并没有改善性能!如果按顺序运行,我会得到相同的确切运行时间。

我怀疑该作业不正确提交到池,但我怎么能检查?

UPDATE
我能够调查多线程和检查工作是否正确提交,看来它的每个线程都有自己的工作,但仍表现并没有改变。

+0

* *如何你衡量它?看起来像创建线程和/或从文件读取克服parallelizm的收益开销。 –

+0

你的意思是收益?我比较两种方法之间的运行时间。如何检查内存开销? – user7631183

+0

由运行时间我的意思是由while循环所花费的时间只有 – user7631183

回答

0

如果你正在阅读从多个线程相同的文件同步的方式(这是因为您正在使用该STD流)已经没有意义,因为所有的文件读取调用将被系统序列化(这是系统如何与文件一起工作)。

也许,如果你使用的异步文件读取(如IO完成),它会帮助你获得的性能(在情况下执行你的工作需要更多的时间比读文件)。

但是,请记住,如果当你在处理你从文件中读取内容有益的工作相当于你不会得到任何东西(但额外的成本和复杂性的管理线程读取操作,上下文切换和同步),因为系统会排队您的IO请求,并且它们将以串行方式执行(除非您正在读取多个不同的物理驱动器)。