3

wininet のいくつかの機能でファイルをダウンロードするために使用します。

 Url := source_file;

 destinationfilename := destination_file;
 hInet := InternetOpen(PChar(application.title), INTERNET_OPEN_TYPE_PRECONFIG,
   nil, nil, 0);
 hFile := InternetOpenURL(hInet, PChar(Url), nil, 0,
   INTERNET_FLAG_NO_CACHE_WRITE, 0);

 if Assigned(hFile) then
 begin
   AssignFile(localFile, destinationfilename);
   Rewrite(localFile, 1);
   repeat
     InternetReadFile(hFile, @Buffer, SizeOf(Buffer), bytesRead);
     BlockWrite(localFile, Buffer, bytesRead);
     current_size := current_size + bytesRead;
   until (bytesRead = 0) OR (terminated = True);
   CloseFile(localFile);
   InternetCloseHandle(hFile);
 end;
 InternetCloseHandle(hInet);

ダウンロード速度を判断しようとしていますが、奇妙な値が得られます。

   ...
   repeat
     QueryPerformanceFrequency(iCounterPerSec);
     QueryPerformanceCounter(T1);

     InternetReadFile(hFile, @Buffer, SizeOf(Buffer), bytesRead);
     BlockWrite(localFile, Buffer, bytesRead);
     current_size := current_size + bytesRead;
     QueryPerformanceCounter(T2);

     _speed := round((bytesRead / 1024) / ((T2 - T1) / iCounterPerSec));

     download_speed := inttostr(_speed) + ' kbps';
   until (bytesRead = 0) OR (terminated = True);
   ...

問題は、ダウンロード速度を kbps 単位で決定する方法です。ご回答ありがとうございます。

4

1 に答える 1

6

略語kbpsがキロバイトではなくキロビットであることを除けば、あなたのコードは私には問題ないように見えます。転送されたキロバイト数、転送にかかった時間、および 2 つの値を割ります。

数値は時間とともに変動します。数値を平滑化するには、代わりに移動平均を使用することをお勧めします。

測定に影響を与える可能性のあるさまざまな要因があります。たとえば、複数のレイヤーのバッファリングが有効になっています。Delphi ファイル バッファが大きい場合、 への一部の呼び出しは、から用に保持されている内部バッファにBlockWriteメモリを単純にコピーしますが、他の呼び出しには、バッファをディスクにフラッシュすることが含まれます。同様に、OS には、時々しか書き込まれないファイル バッファーがある場合があります。したがって、ダウンロード速度だけでなく、ディスク I/O 速度も測定しています。のサイズを大きくすると、反復ごとにファイル バッファーを使い果たす可能性が高くなるため、効果が小さくなります。移動平均は、バッファの蓄積とフラッシュによって導入された変動を打ち消します。BufferlocalFileBuffer

サーバー、またはサーバーとサーバーの間のルーターが速度を制限している可能性があり、他の同時ネットワークトラフィックがある場合でも同じ測定値を取得しているように見える理由を説明できます.

于 2012-12-18T15:14:34.197 に答える