Eho*_*ret 7 .net c# io asynchronous file-copying
为什么下面的代码导致:
public static class Program
{
public static void Main(params string[] args)
{
var sourceFileName = @"C:\Users\ehoua\Desktop\Stuff\800MFile.exe";
var destinationFileName = sourceFileName + ".bak";
FileCopyAsync(sourceFileName, destinationFileName);
// The line below is actually faster and a lot less CPU-consuming
// File.Copy(sourceFileName, destinationFileName, true);
Console.ReadKey();
}
public static async void FileCopyAsync(string sourceFileName, string destinationFileName, int bufferSize = 0x1000, CancellationToken cancellationToken = default(CancellationToken))
{
using (var sourceFile = File.OpenRead(sourceFileName))
{
using (var destinationFile = File.OpenWrite(destinationFileName))
{
Console.WriteLine($"Copying {sourceFileName} to {destinationFileName}...");
await sourceFile.CopyToAsync(destinationFile, bufferSize, cancellationToken);
Console.WriteLine("Done");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
而File.Copy():https://msdn.microsoft.com/en-us/library/system.io.file.copy( v= vs.110).aspx 消耗的cpu要少得多:
因此,使用async/await进行文件复制仍然存在真正的兴趣吗?
我认为保存一个复制线程可能是值得的,但File.Copy windows函数似乎在CPU%方面赢得了战斗.有些人认为这是因为真正的DMA支持,但我仍然在做什么来破坏性能?或者有什么可以通过我的异步方法来提高CPU使用率?
这些是非常荒谬的性能数字.你根本就没有衡量自己的想法.这不应该只是一个小的blip,一个简单的内存到内存副本的缓存文件数据.像File.Copy()一样.在具有不错的DDR3 RAM的机器上以约35千兆字节/秒的速度运行,因此不能超过几十毫秒.即使文件没有被缓存或者机器没有足够的RAM,你仍然无法获得这种CPU负载,你的代码将被阻塞等待磁盘.
您实际看到的是已安装的反恶意软件产品的性能.当它看到程序操纵可执行文件时,它总是将它的内衣捆绑在一起.
简单验证,禁用或排除,然后重试.
File.OpenRead(sourceFileName)相当于对于异步I/O而言new FileStream(sourceFileName,?FileMode.Open,?FileAccess.Read,?FileShare.Read)等效于public FileStream(sourceFileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, false)哪一个false.等效的是File.OpenWrite.
因此,任何XXXAsync操作都不会使用异步I/O,但会使用线程池线程伪造它.
因此它不会产生异步I/O的好处,并且浪费至少一个线程.您在I/O上有一个额外的线程阻塞,这是您想要避免的.我一般都希望异步本身比同步执行稍慢(异步通常会牺牲一次性速度以获得更好的可伸缩性)但是我绝对希望这样做可以做得更好,如果有的话,而不是包装整个内容Task.Run().
我仍然没有想到它会如此糟糕,但也许反恶意软件正在写入.exe.
你希望能更好地复制非exe和异步流.
| 归档时间: |
|
| 查看次数: |
2531 次 |
| 最近记录: |