Delphi:为什么IdHTTP.ConnectTimeout使请求变慢?

时间:2010-05-05 08:46:17

标签: delphi indy idhttp

我发现在为TIdHTTP组件设置ConnectTimeoout属性时,它会使请求(GET和POST)变得慢约120ms?

为什么会这样,我可以以某种方式避免/绕过这个吗?

环境:D2010发布了Indy组件,为D2010安装了所有更新。操作系统是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 ...

1 个答案:

答案 0 :(得分:14)

ConnectTimeout为零(且TIdAntifreeze无效时),Indy只是连接。否则,TIdIOHandlerStack.ConnectClient调用DoConnectTimeout创建新线程进行连接,而调用线程休眠并处理TIdAntifreeze次操作等待建立连接。如果在超时时间之前没有连接,则会抛出异常。

线程不是空闲的,并且在检查连接线程是否已完成其任务之前,调用线程将始终处于休眠状态。默认睡眠持续时间 125 ms 。 (要使用其他内容,请激活TIdAntifreeze并将其IdleTimeout属性设置为低于125.)