Delphi: Почему idhttp.connecttimeout делает запросы медленнее?

StackOverflow https://stackoverflow.com/questions/2771658

  •  03-10-2019
  •  | 
  •  

Вопрос

Я обнаружил, что при настройке свойства ConnectimeoOut для компонента TIDHTTP он делает запросы (Get and Post) стать более 120 мс медленнее?

Почему это, и я могу избежать / обходить это как-то?

ENV: D2010 с отгруженными индийными компонентами, все обновления, установленные для 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;

С помощью Connectimeout установлен в коде, я получаю AVG. Время 130-140 мс, без этого около 5-15 мс ...

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top