Delphi: Почему IdHTTP.ConnectTimeout делает запросы медленнее? - PullRequest
7 голосов
/ 05 мая 2010

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

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

Конверт: 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 в коде я получаю среднее значение. время 130-140 мс, без 5-15 мс ...

1 Ответ

14 голосов
/ 05 мая 2010

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

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

...