c# - 如何使我的应用程序更快地复制文件

标签 c# file-io

我已经创建了从负载平衡服务器例行下载文件的 Windows 应用程序,目前速度约为 30MB/秒。但是我尝试使用 FastCopy 或 TeraCopy,它可以以大约 100MB/秒的速度复制。我想知道如何提高我的复制速度,使其可以比目前更快地复制文件。

最佳答案

使用流时的一个常见错误是一次复制一个字节,或者使用小缓冲区。将数据写入磁盘所需的大部分时间都花在寻道上,因此使用更大的缓冲区将减少每字节的平均寻道时间。

操作系统将文件写入集群中的磁盘。这意味着当您将单个字节写入磁盘时,Windows 实际上会写入一个大小在 512 字节到 64 kb 之间的 block 。使用 64kb 整数倍的缓冲区可以获得更好的磁盘性能。

此外,您可以通过使用 CPU 基础内存页面大小的倍数的缓冲区来获得提升。对于 x86/x64 机器,这可以设置为 4kb 或 4m​​b。

所以你想使用 4mb 的整数倍。

此外,如果您使用异步 IO,您可以充分利用大缓冲区大小。

class Downloader
{
    const int size = 4096 * 1024;
    ManualResetEvent done = new ManualResetEvent(false);
    Socket socket;
    Stream stream;

    void InternalWrite(IAsyncResult ar)
    {
        var read = socket.EndReceive(ar);
        if (read == size)
            InternalRead();
        stream.Write((byte[])ar.AsyncState, 0, read);
        if (read != size)
            done.Set();
    }

    void InternalRead()
    {
        var buffer = new byte[size];
        socket.BeginReceive(buffer, 0, size, System.Net.Sockets.SocketFlags.None, InternalWrite, buffer);
    }

    public bool Save(Socket socket, Stream stream)
    {
        this.socket = socket;
        this.stream = stream;

        InternalRead();
        return done.WaitOne();
    }
}

bool Save(System.Net.Sockets.Socket socket, string filename)
{
    using (var stream = File.OpenWrite(filename))
    {
        var downloader = new Downloader();
        return downloader.Save(socket, stream);
    }
}

关于c# - 如何使我的应用程序更快地复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1286354/

相关文章:

c# - 完成异步任务后更新 Maui Blazor 中的绑定(bind)值的方法是什么?

c# - 提取两个字符串之间的所有字符串

C# 正在 Visual Studio 中编写文件,但在我发布文件时却没有

c# - 使用 powershell 附加到正在运行的程序

c# - 如何使用 Ajax.BeginForm 更新 div 并执行 javascript 函数?

c# - 类型 'DefaultInlineConstraintResolver' 的内联约束解析器无法解析以下内联约束 : 'apiVersion'

java - 限制Java文件中的输入数量

java - 如何将单词存储到数组/数组列表中而不会出现重复的单词

c++ - 为什么对 read() 的调用会永远阻塞

c++ - 使用 MSVC 并发异步写入文件?