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

Я обнаружил, что при установке свойства ConnectTimeoout для компонента TIdHTTP, это выполняет запросы (ДОБЕРИТЕСЬ и POST), станьте приблизительно на 120 мс медленнее?

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

ENV: D2010 с поставленными компонентами Инди, все обновления установлены для D2010. ОС является WinXP SP3 (на 32 бита) с большинством патчей...

Моя стандартная программа синхронизации:

    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...

7
задан K.Sandell 5 May 2010 в 08:46
поделиться

1 ответ

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

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

.
14
ответ дан 6 December 2019 в 15:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: