Какой средний размер буфера для InternetReadFile? - PullRequest
2 голосов
/ 04 июля 2011

Я использую WinInet.h в Delphi для загрузки файлов по HTTP со средним размером от 30 КБ до 1,5 МБ.

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 ]

4 голосов
/ 04 июля 2011

Для таких буферов я обычно код:

var
  Buf: array[word] of byte;

Который выделяет 64 КБ буфера.

Но, из моего небольшого эксперимента, WinINet настолько медленный, что размер внутреннего буфера сильно не изменится.

Если вы ищете производительность, взгляните на WinHTTP , который намного быстрее, чем WinINet . Более чем в 10 раз быстрее, по крайней мере, для нескольких соединений. Единственная отсутствующая функция - это диалоговые окна для удаленного удаленного доступа:

Службы Microsoft Windows HTTP (WinHTTP) предоставляют разработчикам высокоуровневый интерфейс с поддержкой сервера к HTTP / 1.1 интернет-протоколу. WinHTTP предназначен для использования в основном в серверных сценариях серверные приложения, которые общаются с HTTP-серверами.

WinINet был разработан как клиентская платформа HTTP для интерактивных настольные приложения, такие как Microsoft Internet Explorer, Microsoft Офис и Microsoft Money. WinINet отображает пользовательский интерфейс для некоторых такие операции, как сбор пользователя полномочия. WinHTTP, однако, обрабатывает эти операции программно. Серверные приложения, требующие HTTP клиентские сервисы должны использовать WinHTTP вместо WinINet. Для большего информацию смотрите в Портировании WinINet Приложения к WinHTTP.

WinHTTP также предназначен для использования в системных службах и клиенте на основе HTTP Приложения. Тем не менее, однопользовательский приложения, которым требуется протокол FTP функциональность, постоянство файлов cookie, кеширование, автоматический диалог учетных данных обработка, Internet Explorer совместимость или платформа нижнего уровня поддержка должна рассмотреть возможность использования WinINet.

Извлечено из MSDN

Я реализовал доступ клиентов WinInet и WinHTTP в нашей открытой ORM-структуре. Вы можете взглянуть на эту статью блога, чтобы узнать больше информации о WinHTTP .

Насколько я знаю, в последней версии IE используется WinHTTP вместо WinINet . Поэтому мы можем рассмотреть возможность пойти в том же направлении.

0 голосов
/ 04 июля 2011

Нет существенной разницы, но я думаю, что наилучшее значение составляет 65 536 байт (предел tcp для пакета) или 30 000 байт, потому что ваши самые маленькие файлы меньше 65 536.

...