【问题标题】:About choose buffer size in HttpWebRequest GetResponseStream关于在 HttpWebRequest GetResponseStream 中选择缓冲区大小
【发布时间】:2015-05-02 09:00:07
【问题描述】:
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,...
            }
        }
    }
}

我正在编写一个下载器支持更新 UI(可观察千项项目 - 批量下载),当下载进度更改并恢复下载但支持多段下载(因为每个项目的大小通常 我运行大约 5-20 次下载并发。什么缓冲区大小适合这种情况(对 UI 更新和下载都有好处)?

【问题讨论】:

    标签: c# httpwebrequest size buffer


    【解决方案1】:

    您希望使用的缓​​冲区大小是操作系统页面大小的倍数,因为这是写入磁盘和内存页面的粒度。使用小于操作系统页面大小的任何东西都不是最佳选择。

    操作系统页面通常为 4096 字节。 FileStream 的默认缓冲区大小(如果在其构造期间未提供缓冲区大小)也是 4096 字节。

    对于磁盘 I/O,通常最好使用稍大一些的缓冲区 (32-128 KB)。

    在您的场景中,使用最多 20 个并发下载,如果您要使用 32 或 64 KB 的缓冲区大小,则这只需要 640 KB 或 1.2 MB 的内存,因此这些显然是可行的选择。

    假设您在美国,宽带和移动设备的平均下载速度分别为 23 Mbps 和 12 Mbps,那么如果您使用 64 KB 缓冲区(1.2 MB 用于 20 个并发下载),您可以更新 UI 20 次下载中的每一次每秒多次下载。

    因此,至少使用 32 - 64 KB 的缓冲区。

    需要注意的一点,不是不断分配新的字节缓冲区,而是使用缓冲池回收这些固定大小的缓冲区

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 1970-01-01
      • 2017-06-14
      • 2011-12-01
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多