デルフィ:IdHTTP.ConnectTimeout によりリクエストが遅くなるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/2771658

  •  03-10-2019
  •  | 
  •  

質問

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

これはなぜでしょうか? 何らかの方法でこれを回避/バイパスすることはできますか?

環境:D2010 には Indy コンポーネントが同梱されており、D2010 用にすべてのアップデートがインストールされています。OS は WinXP (32bit) 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 を設定すると、avg が得られます。130〜140ミリ秒、それなしの場合は約5〜15ミリ秒です...

役に立ちましたか?

解決

いつ ConnectTimeout ゼロです(そして TIdAntifreeze は効果がありません)、インディは単に接続します。さもないと、 TIdIOHandlerStack.ConnectClient 電話 DoConnectTimeout, 、 どれの 新しいスレッドを作成します 接続をしながら 呼び出し元のスレッドはスリープ状態になります とプロセス TIdAntifreeze 操作を開始し、接続が確立されるのを待機しています。タイムアウトが経過するまでに接続がない場合は、例外がスローされます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top