关于在 HttpWebRequest GetResponseStream 中选择缓冲区大小
About choose buffer size in 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,...
}
}
}
}
我正在写一个下载器支持更新UI(ObservableCollection of thousands items - Batch download)当下载进度改变并恢复下载但不支持多段下载(因为每个项目的大小通常<10MB)。
我运行大约5-20个下载并发。什么缓冲区大小适合这种情况(对 UI 更新和下载都有好处)?
您希望使用的缓冲区大小是 OS 页面大小的倍数,因为这是写入磁盘和内存页面的粒度。使用小于 OS 页面大小的任何内容都不是最佳选择。
OS页一般为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 缓冲区。
需要注意的一点是,不要不断分配新的字节缓冲区,而是使用缓冲池回收这些固定大小的缓冲区
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(ObservableCollection of thousands items - Batch download)当下载进度改变并恢复下载但不支持多段下载(因为每个项目的大小通常<10MB)。
我运行大约5-20个下载并发。什么缓冲区大小适合这种情况(对 UI 更新和下载都有好处)?
您希望使用的缓冲区大小是 OS 页面大小的倍数,因为这是写入磁盘和内存页面的粒度。使用小于 OS 页面大小的任何内容都不是最佳选择。
OS页一般为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 缓冲区。
需要注意的一点是,不要不断分配新的字节缓冲区,而是使用缓冲池回收这些固定大小的缓冲区