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

看板C_and_CPP作者 (GN)時間9年前 (2016/03/23 00:50), 編輯推噓2(2019)
留言21則, 4人參與, 最新討論串1/3 (看更多)
開發平台(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
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.174.211.173 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1458665443.A.396.html

03/23 09:13, , 1F
1.計時的部分,有個東西叫做chrono
03/23 09:13, 1F

03/23 09:13, , 2F
2.你的key能保證在EnterCriticalSection時,每個都不同
03/23 09:13, 2F

03/23 09:14, , 3F
嗎?如果不行,你沒辦法最大化效能
03/23 09:14, 3F

03/23 09:14, , 4F
3.你的thread沒做join,程式居然沒崩潰
03/23 09:14, 4F

03/23 09:15, , 5F
4.在你這情況,你用async會比你用thread好
03/23 09:15, 5F

03/23 09:15, , 6F
5.construct一個thread的成本的確很高,如果你要最大化
03/23 09:15, 6F

03/23 09:15, , 7F
效能,考慮使用threadpool
03/23 09:15, 7F

03/23 09:16, , 8F
03/23 09:16, 8F

03/23 10:04, , 9F
我猜是readfile這卡住你的thread效益
03/23 10:04, 9F

03/23 12:10, , 10F
VC++ 的 std::async() 底層已經有用 thread pool
03/23 12:10, 10F

03/23 12:11, , 11F
如果沒記錯,也僅只於 VC++ 的實作有如此完善 :)
03/23 12:11, 11F

03/23 12:11, , 12F
如果是我會直接用 Intel TBB library 發 tbb::task
03/23 12:11, 12F

03/23 12:12, , 13F
或用微軟的 PPL 發 task 來做 task-based parallelism
03/23 12:12, 13F

03/23 12:16, , 14F
稍微看了一下你的程式碼,還有 lock contention 的問題
03/23 12:16, 14F

03/23 12:17, , 15F
除了 Caesar08 提到的得 join 之外,你得想辦法移掉
03/23 12:17, 15F

03/23 12:18, , 16F
那個 critical secton,例如使用 thread local storage
03/23 12:18, 16F

03/23 12:21, , 17F
如果上面都做了還是慢,裝一下 Intel VTune 分析一下
03/23 12:21, 17F

03/23 12:23, , 18F
fix typo : section
03/23 12:23, 18F

03/23 13:58, , 19F
critical section和mutex是實作lock的方式
03/23 13:58, 19F

03/23 14:00, , 20F
如果使用join那就必須等到thread裡面執行完才能接下去跑
03/23 14:00, 20F

03/23 14:03, , 21F
只是沒想到open thread比thread裡面做的事情還花時間
03/23 14:03, 21F
文章代碼(AID): #1MyNVZEM (C_and_CPP)
文章代碼(AID): #1MyNVZEM (C_and_CPP)