InternetReadFile 的共同平均缓冲区大小是多少?

Posted

技术标签:

【中文标题】InternetReadFile 的共同平均缓冲区大小是多少?【英文标题】:Which is the common-average buffer size for InternetReadFile? 【发布时间】:2011-07-03 21:07:31 【问题描述】:

我在 Delphi 中使用 WinInet.h 通过 HTTP 下载文件,平均大小在 30 KB 到 1.5 MB 之间。

var
  Buf: array[0..BUFFER_SIZE - 1] of Byte;
while BOOL(InternetReadFile(hUrl, @Buf, SizeOf(Buf), BytesRead)) and (BytesRead > 0) do
 if Terminated then
   Exit
 else
 begin
   FStream.WriteBuffer(Buf, BytesRead);
   Synchronize(UpdateProgress);
   FillChar(Buf, SizeOf(Buf), 0);
 end;

此类下载的推荐缓冲区大小是多少 - 既不能太大也不能太小。

【问题讨论】:

使用 Indy (IdHTTP.pas) 【参考方案1】:

对于这样的缓冲区,我通常编写代码:

var
  Buf: array[word] of byte;

分配 64 KB 的缓冲区。

但是,根据我的小实验,WinINet 太慢了,内部缓冲区大小不会有太大变化。

如果您追求性能,请查看 WinHTTP,它比 WinINet 快得多。至少对于多个​​连接而言,速度提高了 10 倍以上。唯一缺少的功能是远程拨号访问的对话框:

Microsoft Windows HTTP 服务 (WinHTTP) 为开发人员提供了一个 服务器支持的高级接口 到 HTTP/1.1 互联网协议。 WinHTTP 旨在用于 主要在基于服务器的场景中 通信的服务器应用程序 使用 HTTP 服务器。

WinINet 被设计为一个 HTTP 客户端平台,用于交互 桌面应用程序,例如 微软 Internet Explorer, 微软 Office 和 Microsoft Money。 WinINet 显示一些用户界面 采集用户等操作 证书。然而,WinHTTP 处理 以编程方式进行这些操作。 需要 HTTP 的服务器应用程序 客户端服务应该使用 WinHTTP 而不是 WinINet。更多 信息,请参阅移植 WinINet WinHTTP 的应用程序。

WinHTTP 也被设计用于系统服务和基于 HTTP 的客户端 应用程序。但是,单用户 需要 FTP 协议的应用程序 功能、cookie 持久性、 缓存,自动凭据对话框 处理, Internet Explorer 兼容性,或下层平台 支持应考虑使用 WinINet。

摘自MSDN

我已经在我们的开源 ORM 框架中实现了 WinInet 和 WinHTTP 客户端访问。您可以查看这篇博客文章以了解more info about WinHTTP

据我所知,最新版本的 IE 使用 WinHTTP 而不是 WinINet。所以我们可以考虑朝同一个方向走。

【讨论】:

链接已损坏! 更新链接:blog.synopse.info/?post/2011/07/04/WinINet-vs-WinHTTP 能否确认实现 WinHTTP 函数(例如下载文件)的函数是 TSQLHttpClientWinSock.InternalRequest ?谢谢。如果函数可以以某种方式分隔在一个文件中,那就太好了...... 更新:我刚刚发现 Indy 的“下载文件”功能 (IdHTTP.pas) 分离得更好。【参考方案2】:

没有显着差异,但我认为最佳值是 65 536 字节(包的 tcp 限制),或 30 000 字节,因为您的最小文件少于 65 536。

【讨论】:

同意,程序员往往喜欢把 2 的幂从他们的帽子里拿出来。考虑到磁盘缓存的大小,我通常选择 128K 或 256K,但除非您实际使用本地 http 服务器和代码分析器对其进行测试,否则可能无法区分。

以上是关于InternetReadFile 的共同平均缓冲区大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章

添加到masm中的缓冲区?

异步使用 InternetReadFile() 的正确方法

InternetReadFile 因分块响应而失败

InternetReadFile() 似乎没有读取互联网数据

InternetReadFile 返回损坏的响应

InternetReadFile 问题(错误 87 - 参数不正确)