Delphi: почему IdHTTP.ConnectTimeout делает запросы медленнее?

Я обнаружил, что при установке свойства ConnectTimeoout для компонента TIdHTTP запросы (GET и POST) становятся примерно на 120 мс медленнее?

почему это, и могу ли я избежать / обойти это как-то?

Env: D2010 с поставленными компонентами Indy, все обновления, установленные для D2010. ОС-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-140ms, без Это о 5-15мс ...

1 ответов


, когда ConnectTimeout равна нулю (и TIdAntifreeze не действует), инди просто подключается. В противном случае, TIdIOHandlerStack.ConnectClient звонки DoConnectTimeout, который создает новый поток сделать подключения а вызывающая нить спит и процессы TIdAntifreeze операции, ожидающие установления соединения. Если к моменту истечения тайм-аута соединение не установлено, возникает исключение.

потоки не свободны, и вызывающий поток всегда будет спать перед проверкой ли резьбовые соединения выполнил свою задачу. Продолжительность сна по умолчанию 125 МС. (Чтобы использовать что-то еще, активируйте TIdAntifreeze и установить его IdleTimeout свойство ниже 125.)