7

TIdHTTP コンポーネントの ConnectTimeoout プロパティを設定すると、リクエスト (GET および POST) が約 120 ミリ秒遅くなることがわかりました。

これはなぜですか?どうにかしてこれを回避/バイパスできますか?

Env: 出荷された Indy コンポーネントを含む D2010、D2010 用のすべての更新プログラムがインストールされています。OS は WinXP (32 ビット) SP3 で、ほとんどのパッチが適用されています...

私のタイミングルーチンは次のとおりです。

    Procedure DoGet;
    Var
       Freq,T1,T2 : Int64;
       Cli        : TIdHTTP;
       S          : String;
    begin
         QueryPerformanceFrequency(Freq);
         Try
            QueryPerformanceCounter(T1);
            Cli := TIdHTTP.Create( NIL );
            Cli.ConnectTimeout := 1000;  // without this we get < 15ms!!
            S := Cli.Get('http://127.0.0.1/empty_page.php');
         Finally
            FreeAndNil(Cli);
            QueryPerformanceCounter(T2);
         End;
         Memo1.Lines.Add('Time = '+FormatFloat('0.000',(T2-T1)/Freq) );
    End;

コードで ConnectTimeout を設定すると、平均が得られます。130〜140msの時間、それなしでは約5〜15msです...

4

1 に答える 1

14

ConnectTimeoutがゼロの場合(そして有効ではない場合TIdAntifreeze)、Indyは単に接続します。それ以外の場合は、をTIdIOHandlerStack.ConnectClient呼び出しますDoConnectTimeout。これにより、呼び出し元のスレッドがスリープして操作を処理し、接続が確立されるのを待つ間に、接続を行うための新しいスレッドが作成されます。タイムアウトが経過するまでに接続がない場合は、例外がスローされます。TIdAntifreeze

スレッドは解放されておらず、接続スレッドがそのタスクを完了したかどうかを確認する前に、呼び出し元のスレッドは常にスリープ状態になります。デフォルトのスリープ時間は125ミリ秒です。TIdAntifreeze(他のものを使用するには、そのプロパティをアクティブにしてIdleTimeout125未満に設定します。)

于 2010-05-05T14:03:43.917 に答える