为什么 .NET 异步等待文件复制比同步 File.Copy() 调用消耗更多 CPU?

2024-05-13

为什么下面的代码会产生:

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");
            }
        }
    }
}

当 File.Copy() 时:https://msdn.microsoft.com/en-us/library/system.io.file.copy(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/system.io.file.copy(v=vs.110).aspxcpu消耗少很多:

那么,是否还有人真正感兴趣使用 async/await 来进行文件复制呢?

我认为保存一个线程进行复制可能是值得的,但 File.Copy 窗口函数似乎在 CPU 百分比方面轻而易举地赢得了这场战斗。有些人会认为这是因为真正的 DMA 支持,但我是否做了任何事情来破坏性能?或者可以采取什么措施来提高我的异步方法的 CPU 使用率?


这些都是相当荒谬的性能数字。你根本就没有衡量你所认为的自己。这应该不会超过一个小问题,即缓存文件数据的简单内存到内存复制。就像 File.Copy() 所做的那样。在具有良好 DDR3 RAM 的机器上以约 35 GB/秒的速度运行,因此不会超过几十毫秒。即使文件没有被缓存或者机器没有足够的 RAM,那么你仍然无法获得这种 CPU 负载,你的代码将被阻塞等待磁盘。

你是什​​么actually查看的是您安装的反恶意软件产品的性能。当它看到程序操作可执行文件时,它总是会得到它的内衣。

验证起来很简单,禁用它或进行排除并重试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 .NET 异步等待文件复制比同步 File.Copy() 调用消耗更多 CPU? 的相关文章

随机推荐