Delphi: ¿Por qué IdHTTP.ConnectTimeout realizar solicitudes más lentas?
Pregunta
he descubierto que al establecer la propiedad ConnectTimeoout para un componente TIdHTTP, hace que las peticiones (GET y POST) se vuelven más lentas sobre 120ms?
¿Por qué es esto, y puede evitar I / derivación de esto de alguna manera?
Env: D2010 con componentes Indy enviados, todas las actualizaciones para instalar D2010. OS es WinXP (32 bits) SP3 con la mayoría de los parches ...
Mi rutina de sincronización es:
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;
Con el conjunto ConnectTimeout en el código consigo promedio. tiempos de 130-140ms, sin se trata de 5-15ms ...
Solución
Cuando ConnectTimeout
es cero (y TIdAntifreeze
no está en vigor), Indy simplemente se conecta. De lo contrario, TIdIOHandlerStack.ConnectClient
llama DoConnectTimeout
, que crea un nuevo hilo para hacer la conexión, mientras que el subproceso de llamada duerme y procesos TIdAntifreeze
operaciones, a la espera de que se establezca la conexión. Si no hay conexión en el momento en el que transcurra tiempo de espera, se genera una excepción.
Temas no son libres, y el hilo que llama siempre el sueño antes de comprobar si la rosca de conexión ha cumplido su tarea. La duración del sueño por defecto es 125 ms . (Para usar otra cosa, activar TIdAntifreeze
y establezca su propiedad IdleTimeout
más baja que 125).