[問題] 使用thread更慢的問題

作者: a2975313 (GN)   2016-03-23 00:50:40
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
windows 10, visual studio 2013
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
google v8
問題(Question):
一樣的邏輯搬到thread去, 計時後發現反而更慢, 難道open thread的cost比我的邏輯
還重嗎? 有沒有人知道其中的原理.
程式碼(Code):(請善用置底文網頁, 記得排版)
主要功能是 (readfile→compile→run)*4, 然後計時此round花了多久時間.
但NonThread跑1000個round平均≒0.000812/s
使用Thread跑1000個round平均≒0.004850/s
我並非計時thread裡面的時間, 而是計時open thread的時間, 這樣還差了6倍 很怪~
http://imgur.com/l7jNKWJ
http://imgur.com/9jnAS1o
作者: a2975313 (GN)   2016-03-23 13:58:00
critical section和mutex是實作lock的方式如果使用join那就必須等到thread裡面執行完才能接下去跑只是沒想到open thread比thread裡面做的事情還花時間
作者: LiloHuang (十年一刻)   2016-03-23 12:10:00
VC++ 的 std::async() 底層已經有用 thread pool如果沒記錯,也僅只於 VC++ 的實作有如此完善 :)如果是我會直接用 Intel TBB library 發 tbb::task或用微軟的 PPL 發 task 來做 task-based parallelism稍微看了一下你的程式碼,還有 lock contention 的問題除了 Caesar08 提到的得 join 之外,你得想辦法移掉那個 critical secton,例如使用 thread local storage如果上面都做了還是慢,裝一下 Intel VTune 分析一下fix typo : section
作者: Caesar08 (Caesar)   2016-03-23 09:13:00
1.計時的部分,有個東西叫做chrono2.你的key能保證在EnterCriticalSection時,每個都不同嗎?如果不行,你沒辦法最大化效能3.你的thread沒做join,程式居然沒崩潰4.在你這情況,你用async會比你用thread好5.construct一個thread的成本的確很高,如果你要最大化效能,考慮使用threadpool6.我的拙作 https://github.com/Fdhvdu/ThreadPool
作者: TeaEEE (愛不趴 不愛趴)   2016-03-23 10:04:00
我猜是readfile這卡住你的thread效益

Links booklink

Contact Us: admin [ a t ] ucptt.com