今天考慮優化專案中檔案操作,專案中有許多批量刪除檔案的操作,當檔案很多時,刪除操作會比較費時(1s~2s的時間也顯得有點慢了),更何況10s以上,想要通過多執行緒來同時處理多個檔案的刪除,在程式中使用了threadpool和parallel想要加速刪除,但是效果並沒有預期的明顯,總耗時甚至還有所提公升。
先看使用普通迴圈刪除目錄的**:
var dir = directory.
getdirectories
("d:\\filestore1\\",""
, searchoption.topdirectoryonly)
; console.
writeline
($"一共個目錄");
stopwatch stopwatch =
newstopwatch()
; stopwatch.
start()
;foreach
(var temp in dir)
stopwatch.
stop()
; console.
writeline
("耗時:"
+stopwatch.elapsedmilliseconds+
"毫秒");
console.
writeline
("操作完畢"
);
執行結果:
然後我們使用parallel試一下:
var dir = directory.
getdirectories
("d:\\filestore1\\",""
, searchoption.topdirectoryonly)
; console.
writeline
($"一共個目錄");
stopwatch stopwatch =
newstopwatch()
; stopwatch.
start()
; parallel.
foreach
(dir,
(temp)
=>);
stopwatch.
stop()
; console.
writeline
("耗時:"
+stopwatch.elapsedmilliseconds+
"毫秒");
console.
writeline
("操作完畢"
);
執行結果:
可以看到,確實快了6秒左右,但是這和我們的預期差的遠,還有乙個用threadpool執行的,但是無法確定總執行時間,所以就只貼**算了:
var dir = directory.
getdirectories
("d:\\filestore1\\",""
, searchoption.topdirectoryonly)
; console.
writeline
($"一共個目錄");
stopwatch stopwatch =
newstopwatch()
; stopwatch.
start()
;foreach
(var temp in dir)))
;}stopwatch.
stop()
; console.
writeline
("耗時:"
+stopwatch.elapsedmilliseconds+
"毫秒");
console.
writeline
("操作完畢"
);
enmmmm…到底咋回事兒,原本20多秒的操作,用了多執行緒還是20多秒,這時候我們就應該考慮檔案讀寫操作的底層機制了,要知道剛剛我們的io操作都是針對磁碟進行操作的,而磁碟操作全靠磁碟的磁頭來尋道定位,乙個磁碟只有乙個磁頭(現在計算機磁碟都有多個磁頭)
那麼問題來了,我們每個執行緒都要對磁頭進行操作,乙個磁頭只能為乙個執行緒使用,如果只有乙個磁頭的話,我們開再多執行緒也要排隊使用啊,所以,對於io操作使用多執行緒,具體速度有沒有提公升,很大程度上取決於磁碟(磁頭數),不過,使用多執行緒確實可以讓檔案操作在後台執行,提公升使用者體驗。
「多執行緒IO」和「單執行緒非同步IO」的對比
順手寫了個程式對比了一下多執行緒io和單執行緒非同步io的效能差異。需要說明的是,linux上目前的非同步io是由使用者態執行緒模擬的。目前核心原生的aio和glibc中的非同步io都有缺陷,libeio目前感覺比較好 因為nodejs在用 單執行緒非同步io指的是主線程中控制io的 全部都是在主線...
多執行緒同步I O和單執行緒非同步I O
2014 08 24 同步i o與非同步i o 執行緒在執行中如果遇到磁碟讀寫或網路通訊 統稱io操作 通常要耗費較長的時間,這時os會剝奪此執行緒的cpu控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式稱為阻塞。當i o操作完畢時,作業系統將這個執行緒的阻塞狀態解除,恢復其...
python 多執行緒偽 多執行緒筆記 偽非同步IO
bio的時候,乙個客戶端對應伺服器的一條執行緒,比較耗執行緒資源.在此基礎上,對起執行緒進行優化,建立乙個執行緒池,對執行緒進行管理,可以設定乙個最大執行緒數 maxthreadcount.這樣,達到執行緒可控的目的.即使外面有遠大於執行緒數的連線過來,也不至於讓伺服器撐爆.多出的客戶端,就進入執行...