Я обнаружил, что при установке свойства 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...
Когда ConnectTimeout
равен нулю (и TIdAntifreeze
не действует), Indy просто подключается. В противном случае TIdIOHandlerStack.ConnectClient
вызывает DoConnectTimeout
, который создает новый поток для выполнения соединения, пока вызывающий поток спит и обрабатывает операции TIdAntifreeze
, ожидая установления соединения. Если к моменту истечения тайм-аута соединение не установлено, возникает исключение.
Нити не являются свободными, и вызывающий поток всегда будет спать, прежде чем проверить, выполнил ли поток соединения свою задачу. По умолчанию продолжительность сна составляет 125 мс. (Чтобы использовать что-то другое, активируйте TIdAntifreeze
и установите его свойство IdleTimeout
меньше 125.)