2017-03-17 77 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請求,並且它們將以串行方式執行(除非您正在讀取多個不同的物理驅動器)。