我从负载均衡服务器创建了常规下载文件的Windows应用程序,目前速度约为30MB /秒.但是,我尝试使用FastCopy或TeraCopy,它可以以大约100MB /秒的速度复制.我想知道如何提高我的复制速度,使其能够比当前更快地复制文件.
使用流时的一个常见错误是一次复制一个字节,或者使用一个小缓冲区。将数据写入磁盘所需的大部分时间都花在查找上,因此使用较大的缓冲区将减少每字节的平均查找时间。
操作系统将文件写入集群中的磁盘。这意味着当您向磁盘写入单个字节时,Windows 实际上会写入大小在 512 字节到 64 kb 之间的块。使用 64kb 整数倍的缓冲区可以获得更好的磁盘性能。
此外,您可以通过使用 CPU 底层内存页面大小的倍数的缓冲区来获得提升。对于 x86/x64 机器,可以将其设置为 4kb 或 4mb。
所以你想使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6152 次 |
| 最近记录: |