关于在httpwebrequest getResponsestream中选择缓冲区大小


var h = (HttpWebRequest)WebRequest.Create(url);
using (var hr = (HttpWebResponse)(await h.GetResponseAsync()))
{
    using (var s = hr.GetResponseStream())
    {
        using (var f = new FileStream(saveTo, FileMode.Create, FileAccess.Write, FileShare.None))
        {
            int bytesCount = 0;
            byte[] buf = new byte[2048]; //<------------------------------
            while ((bytesCount = await s.ReadAsync(buf, 0, buf.Length)) > 0)
            {
                await f.WriteAsync(buf, 0, bytesSize);
                // Update UI : downloaded size, percent,...
            }
        }
    }
}

我正在写下载器支持 update UI (thounsands项目的observableCollection -batch download)当下载进度更改并恢复下载并恢复下载,但是 not> not> not 支持多段下载(因为每个项目的大小用使用&lt; 10mb)。
我运行约5-20个下载并发。什么缓冲区大小适合这种情况(适用于UI更新和下载)?

您想使用OS页面大小的倍数的缓冲区大小,因为这是写入磁盘和页面中的粒度。使用小于OS页面大小的任何内容都将是次优的。

OS页面通常为4096字节。FileStream的默认缓冲区大小,如果在其构造过程中没有提供缓冲尺寸的话,则使用4096字节。

对于磁盘I/O,通常最好具有更大的缓冲区(32-128 kb)。

在您的情况下,最多使用20个并发下载,如果您要使用32或64 KB的缓冲区大小,这仅需要640 kb或1.2 mb的内存,因此这些显然是可行的选择。p>让我们假设您在美国,平均下载速度分别为23 Mbps和12 Mbps,宽带和移动设备分别为12 Mbps,那么,如果您使用的是64 kb的缓冲液(1.2 MB for 20同时下载),则可以更新UI每秒下载几次下载中的每一个。

因此,使用至少32-64 kb缓冲液。

要注意的一件事,不是不断分配新的字节缓冲区,而是通过使用缓冲池

来回收这些固定尺寸的缓冲区

最新更新