Domanda

ho scoperto che quando si imposta la proprietà ConnectTimeoout per un componente TIdHTTP, rende le richieste (GET e POST) diventano circa 120ms più lento?

Perché è questo, e posso evitare di / by-pass presente in qualche modo?

Env: D2010 con componenti Indy spediti, tutti gli aggiornamenti installati per D2010. OS è WinXP (32bit) SP3 con la maggior patch ...

La mia routine di sincronizzazione è:

    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 il set ConnectTimeout nel codice ottengo avg. tempi di 130-140ms, senza si tratta di 5-15ms ...

È stato utile?

Soluzione

Quando ConnectTimeout è zero (e TIdAntifreeze non è in effetti), Indy collega semplicemente. In caso contrario, TIdIOHandlerStack.ConnectClient chiama DoConnectTimeout, che crea un nuovo thread per fare il collegamento, mentre il thread chiamante dorme e processi TIdAntifreeze operazioni, in attesa che il collegamento da stabilire. Se non c'è connessione con il tempo le scadere di timeout, viene generata un'eccezione.

Le discussioni non sono liberi, e il thread chiamante sarà sempre il sonno prima di verificare se il thread di connessione ha compiuto il suo compito. La durata del sonno di default è 125 ms . (Ad uso qualcos'altro, attivare TIdAntifreeze e impostare la proprietà IdleTimeout inferiore a 125).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top