从Internet下载文件时分配的最佳内存缓冲区大小是多少?

Dev*_*per 13 .net c# download

从Internet下载文件时分配的最佳内存缓冲区大小是多少?有些样本说它应该是1K.好吧,我需要知道一般为什么呢?如果我们下载一个小型.PNG或大型的,有.AVI什么区别?

Stream remoteStream;
Stream localStream;
WebResponse response;

try
{
    response = request.EndGetResponse(result);

    if (response == null)
        return;

    remoteStream = response.GetResponseStream();

    var localFile = Path.Combine(FileManager.GetFolderContent(), TaskResult.ContentItem.FileName);
    localStream = File.Create(localFile);

    var buffer = new byte[1024];
    int bytesRead;

    do
    {
        bytesRead = remoteStream.Read(buffer, 0, buffer.Length);
        localStream.Write(buffer, 0, bytesRead);
        BytesProcessed += bytesRead;
    } while (bytesRead > 0);
}
Run Code Online (Sandbox Code Playgroud)

Dev*_*aig 18

为了它的价值,我测试了使用2的渐进幂(大小为2,4,8,16 ......)读取1484 KB文本文件.我打印到控制台窗口,读取每个窗口所需的毫秒数.在8192年左右,它似乎并没有什么区别.以下是我的Windows 7 64位计算机上的结果.

2^1 = 2 :264.0151
2^2 = 4 :193.011
2^3 = 8 :175.01
2^4 = 16 :153.0088
2^5 = 32 :139.0079
2^6 = 64 :134.0077
2^7 = 128 :132.0075
2^8 = 256 :130.0075
2^9 = 512 :133.0076
2^10 = 1024 :133.0076
2^11 = 2048 :90.0051
2^12 = 4096 :69.0039
2^13 = 8192 :60.0035
2^14 = 16384 :56.0032
2^15 = 32768 :53.003
2^16 = 65536 :53.003
2^17 = 131072 :52.003
2^18 = 262144 :53.003
2^19 = 524288 :54.0031
2^20 = 1048576 :55.0031
2^21 = 2097152 :54.0031
2^22 = 4194304 :54.0031
2^23 = 8388608 :54.003
2^24 = 16777216 :55.0032
Run Code Online (Sandbox Code Playgroud)

  • 有趣的结果.我说它看起来更像16k是神奇的数字而不是8k.那里仍然有7%的改善. (2认同)

MSa*_*ers 6

使用至少4KB.这是Windows的正常页面大小(即Windows本身管理内存的粒度),这意味着.Net内存分配器不需要将4KB页面分解为1KB分配.

当然,使用64KB块会更快,但只是略微如此.