日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多线程下的IO操作

發布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程下的IO操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天考慮優化項目中文件操作,項目中有許多批量刪除文件的操作,當文件很多時,刪除操作會比較費時(1s~2s的時間也顯得有點慢了),更何況10s以上,想要通過多線程來同時處理多個文件的刪除,在程序中使用了ThreadPool和Parallel想要加速刪除,但是效果并沒有預期的明顯,總耗時甚至還有所提升。
先看使用普通循環刪除目錄的代碼:

var dir = Directory.GetDirectories("D:\\FileStore1\\", "", SearchOption.TopDirectoryOnly);Console.WriteLine($"一共{dir.Length}個目錄");Stopwatch stopwatch = new Stopwatch();stopwatch.Start();foreach (var temp in dir){//刪除目錄操作(自己封裝的接口,也可使用Directory.Delete方法)fileStorage.DeleteDirectory("user", temp.Split("\\").Last());}stopwatch.Stop();Console.WriteLine("耗時:"+stopwatch.ElapsedMilliseconds+"毫秒");Console.WriteLine("操作完畢");

運行結果:

然后我們使用Parallel試一下:

var dir = Directory.GetDirectories("D:\\FileStore1\\", "", SearchOption.TopDirectoryOnly);Console.WriteLine($"一共{dir.Length}個目錄");Stopwatch stopwatch = new Stopwatch();stopwatch.Start();Parallel.ForEach(dir, (temp) =>{fileStorage.DeleteDirectory("user", temp.Split("\\").Last());});stopwatch.Stop();Console.WriteLine("耗時:"+stopwatch.ElapsedMilliseconds+"毫秒");Console.WriteLine("操作完畢");

運行結果:

可以看到,確實快了6秒左右,但是這和我們的預期差的遠,還有一個用ThreadPool執行的,但是無法確定總執行時間,所以就只貼代碼算了:

var dir = Directory.GetDirectories("D:\\FileStore1\\", "", SearchOption.TopDirectoryOnly);Console.WriteLine($"一共{dir.Length}個目錄");Stopwatch stopwatch = new Stopwatch();stopwatch.Start();foreach (var temp in dir){ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>{fileStorage.DeleteDirectory("user", temp.Split("\\").Last());})); }stopwatch.Stop();Console.WriteLine("耗時:"+stopwatch.ElapsedMilliseconds+"毫秒");Console.WriteLine("操作完畢");

enmmmm…到底咋回事兒,原本20多秒的操作,用了多線程還是20多秒,這時候我們就應該考慮文件讀寫操作的底層機制了,要知道剛剛我們的IO操作都是針對磁盤進行操作的,而磁盤操作全靠磁盤的磁頭來尋道定位,一個磁盤只有一個磁頭(現在計算機磁盤都有多個磁頭)

那么問題來了,我們每個線程都要對磁頭進行操作,一個磁頭只能為一個線程使用,如果只有一個磁頭的話,我們開再多線程也要排隊使用啊,所以,對于IO操作使用多線程,具體速度有沒有提升,很大程度上取決于磁盤(磁頭數),不過,使用多線程確實可以讓文件操作在后臺運行,提升用戶體驗。

總結

以上是生活随笔為你收集整理的多线程下的IO操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。