InternetReadFile的通用平均缓冲区大小是多少?

时间:2011-07-03 21:07:31

标签: delphi download size buffer wininet

我在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;

这种下载的推荐缓冲区大小是多少 - 如果不是太大也不应该太小。

2 个答案:

答案 0 :(得分:4)

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

var
  Buf: array[word] of byte;

分配64 KB的缓冲区。

但是,从我的小实验中, WinINet 非常慢,内部缓冲区大小不会发生太大变化。

如果你看看性能,看看的的WinHTTP 的,比的的WinINet 的快得多。速度提高10倍以上,至少对于多个​​连接而言。只有缺少功能的是远程拨号访问的对话框:

  

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

     

WinINet被设计为用于交互式的HTTP客户端平台   桌面应用程序,例如   Microsoft Internet Explorer,Microsoft   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 。所以我们可以考虑朝着同一个方向前进。

答案 1 :(得分:0)

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