2011-07-03 79 views
2

我在Delphi中使用WinInet.h來通過HTTP下載文件,平均大小在30 KB到1.5 MB之間。InternetReadFile的共同平均緩衝區大小是多少?

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; 

此類下載的推薦緩衝區大小是多少?如果不應該太大也不要太小。

回答

4

對於這樣的緩衝區,我usualy代碼:

var 
    Buf: array[word] of byte; 

其中分配64 KB的緩衝區。

但是,從我的小實驗中,WinINet太慢了,內部緩衝區大小不會變化太大。

如果你看看性能,看看WinHTTP的,比的WinINet快得多。速度提高10倍以上,至少對於多重連接而言。唯一缺少的功能是遠程撥號接入的對話框:

的Microsoft Windows HTTP服務(WinHTTP)爲開發人員提供一個 服務器支持的,高層次的接口 到HTTP/1.1互聯網協議。 WinHTTP旨在主要在基於服務器的場景中使用 , 服務器應用程序將 與HTTP服務器進行通信。

是的WinINet設計爲交互式 桌面應用程序的HTTP客戶端平臺,如 微軟IE瀏覽器,微軟 辦公室,和Microsoft資金。 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。所以我們可能會考慮走向同一個方向。

0

沒有顯著差異,但我認爲最值是65個536字節(包TCP限制),或30個字節000,因爲你最小的文件更小的65 536

+1

同意,程序員傾向於從他們的帽子中取出2的權力。鑑於磁盤緩存的大小,我通常會選擇128K或256K,但除非您使用本地http服務器和代碼分析器進行實際測試,否則很可能無法區分它們。 –