delphi用API复制文件多线程的速度如何比单线程还慢
delphi用API复制文件多线程的速度怎么比单线程还慢?
我做了个多线程复制的小工具,用的是CopyFile函数,复制128M的几个视频,但是多线程复制的速度不理想
1个线程复制用了5.5秒
3个线程却用了6.07秒,
复制1.25G的文件
1个线程用了205s
10个线程用了2.6.5s
为什么会这样呢?
各位帮帮忙看下
------解决方案--------------------
因为磁盘的磁头只有一个,多线程读写文件会导致磁头频繁寻道,从而降低效率。
------解决方案--------------------
谁告诉你线程一定会快了,cpu负担增加了,还要调度线程,你说是什么结果
------解决方案--------------------
磁盘的调度算法之中 循环扫描调度算法是最佳的。
也就是说 一次性将顺序排列的盘块读出
你这样多线程只会降低磁盘自身调度机制的效率
------解决方案--------------------
多线程从来不是解决快慢的问题。不知道谁最先说多线程会提高效率的,真是害的人多了。
多线程是一种并行思想体现,只有适合并行来做的事情才用,如果不适合的,根本就没必要用。
------解决方案--------------------
我看过下 FastCopy 的源码,用 vc 可编译通过,大致他是分为读文件线程及写文件线程,然后还有磁盘缓存(读出来的缓存),当然,还有非常低级的绝对磁盘读及绝对磁盘写,反正它的优化是非常多面的,而不是仅仅依靠线程,所以几乎可以达到磁盘 IO 所说的极限速度
我做了个多线程复制的小工具,用的是CopyFile函数,复制128M的几个视频,但是多线程复制的速度不理想
1个线程复制用了5.5秒
3个线程却用了6.07秒,
复制1.25G的文件
1个线程用了205s
10个线程用了2.6.5s
为什么会这样呢?
各位帮帮忙看下
- Delphi(Pascal) code
procedure Copy(); //复制 var i: word; begin with MainForm do begin Path := Edit.Text; //path 是个全局的string变量 for i := 0 to FList.Count - 1 do //filelist是储存目标文件路径的stringlist变量 begin if DirectoryExists(Path)then begin if CopyFile(PChar(FList[i]),Pchar(Path +'\'+ ExtractFileName(FList[i])),false) then begin Cs.Enter; //cs是个全局的临界区类 inc(Proc);//d当前进度 StatusBar.Panels[3].Text := Format('进度: %d/%d',[Proc,FileMemo.Lines.Count]); ProgressBar.Position := ProgressBar.Position + 1; RichEdit.Lines.Add('[提示] 文件'+Flist.Strings[i]+'复制成功'); Cs.Leave; Continue; end else begin Cs.Enter; RichEdit.Lines.Add(''); RichEdit.SelStart := Echo.GetTextLen; RichEdit.Text := Format('%s[提示] 文件“%s”复制失败',[Echo.Text,Flist.Strings[i]]); RichEdit.SelLength := Length( Format('[提示] 文件“%s”复制失败',[Flist.Strings[i]])); Echo.SelAttributes.Color := clRed; Cs.Leave; end; end; end; end; Dec(TCount); end;
------解决方案--------------------
因为磁盘的磁头只有一个,多线程读写文件会导致磁头频繁寻道,从而降低效率。
------解决方案--------------------
谁告诉你线程一定会快了,cpu负担增加了,还要调度线程,你说是什么结果
------解决方案--------------------
磁盘的调度算法之中 循环扫描调度算法是最佳的。
也就是说 一次性将顺序排列的盘块读出
你这样多线程只会降低磁盘自身调度机制的效率
------解决方案--------------------
多线程从来不是解决快慢的问题。不知道谁最先说多线程会提高效率的,真是害的人多了。
多线程是一种并行思想体现,只有适合并行来做的事情才用,如果不适合的,根本就没必要用。
------解决方案--------------------
我看过下 FastCopy 的源码,用 vc 可编译通过,大致他是分为读文件线程及写文件线程,然后还有磁盘缓存(读出来的缓存),当然,还有非常低级的绝对磁盘读及绝对磁盘写,反正它的优化是非常多面的,而不是仅仅依靠线程,所以几乎可以达到磁盘 IO 所说的极限速度