代码之家  ›  专栏  ›  技术社区  ›  K.Sandell

Delphi:为什么idhttp.connectTimeout会使请求变慢?

  •  7
  • K.Sandell  · 技术社区  · 14 年前

    我发现,当为TidHTTP组件设置ConnectTimeout属性时,它会使请求(get和post)变慢大约120ms?

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

    ENV: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 回复  |  直到 14 年前
        1
  •  14
  •   Rob Kennedy    14 年前

    什么时候? ConnectTimeout 是零(和 TIdAntifreeze 实际上不是),印地只是连接。否则, TIdIOHandlerStack.ConnectClient 电话 DoConnectTimeout ,其中 创建新线程 做连接的同时 主叫线程休眠 和过程 tid防冻剂 操作,等待建立连接。如果在超时结束时没有连接,它将抛出一个异常。

    线程不是空闲的,调用线程在检查连接线程是否已完成其任务之前总是处于休眠状态。默认睡眠持续时间为 125毫秒 . (要使用其他东西,激活 tid防冻剂 并设置其 IdleTimeout 属性低于125。)