[問題] 把 fread 獨立出來後 變超慢

看板C_and_CPP (C/C++)作者 (= =)時間13年前 (2012/08/22 00:27), 編輯推噓1(1021)
留言22則, 5人參與, 最新討論串1/1
有問題想問版上大大們 最近在linux下寫一個程式 主要是把 讀檔(讀gzip)的部分 全交給一個thread 來做 然後其他threads 負責處理讀進來的字元 有測試只跑 fileRead,不跑 getData,速度是正常的 但若一個thread 跑fileRead,四個threads getData 執行速度卻變得超級超級慢 目前還不知變慢的確切原因, 有懷疑是lock unlock 在context switch overhead 太高 所以想請板上大大提供些意見,還是說這樣的 implement 不可行? 程式碼大概如下: int isEof = 0; string str; void fileRead(FILE *fp){ isEof = 0 char buf[1025]; while (!isEof){ int result = Fread(buf, 1, 1024, fp); if (result == 0) { isEof = 1;} pthread_mutex_lock(&lock); str.append(buf); pthread_mutex_unlock(&lock); }} int getData(char buf[1025], int sz = 1024){ while (!isEof && str.size() < sz) { } int sz = str.size() >= sz ? sz : str.size(); pthread_mutex_lock(&lock); str.copy(buf, sz, 0); str.erase(0, sz); pthread_mutex_unlock(&lock); return sz; } PS: 附上io循序版本的getData getData(char buf[1025], int sz = 1024){ return Fread(buf, 1, sz, fp) } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.43.178.244

08/22 00:34, , 1F
你同時一邊Read一邊Get嗎?
08/22 00:34, 1F

08/22 00:36, , 2F
對 @@
08/22 00:36, 2F

08/22 00:38, , 3F
為什麼你覺得這樣會比較快呢 XD
08/22 00:38, 3F

08/22 00:42, , 4F
想說多點threads 處理data 是否可以變得跟讀檔一樣快 >"<
08/22 00:42, 4F

08/22 00:48, , 5F
會建議先把整個檔案讀進陣列,再用不同執行緒切割處理
08/22 00:48, 5F

08/22 00:50, , 6F
這一個檔案解壓縮後有30G = ="
08/22 00:50, 6F

08/22 01:56, , 7F
一次讀一個大區塊, 多 thread 處理, io 循序比較快
08/22 01:56, 7F

08/22 03:54, , 8F
fileRead() 怎麼只 check result 是否為零呢? 怎麼能
08/22 03:54, 8F

08/22 03:55, , 9F
確定讀進來一定是 c-type string 呢? 就算 append 成
08/22 03:55, 9F

08/22 03:57, , 10F
功了, 在 getData() 裡面把 copy 的字元數寫死前面的
08/22 03:57, 10F

08/22 03:57, , 11F
比較就顯得沒意義了, 讀進來的 bytes 數真的那麼剛好?
08/22 03:57, 11F

08/22 07:56, , 12F
可以請問一下為什麼會lock buf 你是共用buf 這個變數?
08/22 07:56, 12F

08/22 08:02, , 13F
感謝ledia的建議 看來還是用 多thread io 循序就好
08/22 08:02, 13F

08/22 08:07, , 14F
我原本以為做成每個thread 去拿io時 改成 getData
08/22 08:07, 14F

08/22 08:08, , 15F
讓1個thread 全力去解壓縮 也就是這裡的Fread
08/22 08:08, 15F

08/22 08:14, , 16F
現在看來Fread 有可能被 lock unlock 的compete 拖慢
08/22 08:14, 16F
※ 編輯: mantix 來自: 114.43.176.234 (08/22 08:16) ※ 編輯: mantix 來自: 114.43.176.234 (08/22 08:17)

08/22 08:18, , 17F
這裡lock 的對象是str
08/22 08:18, 17F
※ 編輯: mantix 來自: 114.43.176.234 (08/22 08:20)

08/22 08:22, , 18F
發現原文有些錯誤 修了一下原文
08/22 08:22, 18F
※ 編輯: mantix 來自: 114.43.176.234 (08/22 08:26)

08/22 08:27, , 19F
抱歉 原本附的code太多錯誤 Orz
08/22 08:27, 19F

08/24 13:41, , 20F
發現一個問題 isEoF = 1 時 while 仍舊沒停下來 不曉得原因
08/24 13:41, 20F

08/24 13:41, , 21F
getData 就hang 住了
08/24 13:41, 21F

08/24 13:43, , 22F
如果在 getData 的 while 裡頭加上printf 就不會hang 住
08/24 13:43, 22F
文章代碼(AID): #1GCxRN_Y (C_and_CPP)
文章代碼(AID): #1GCxRN_Y (C_and_CPP)