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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top