Delphi: Warum IdHTTP.ConnectTimeout Anfragen in langsamer?
Frage
Ich entdeckte, dass, wenn die ConnectTimeoout Eigenschaft für eine Komponente TIdHTTP Einstellung, es die Anforderungen macht (GET und POST) langsamer über 120 ms werden?
Warum ist das und kann ich vermeiden / Bypass dieses irgendwie?
Env: D2010 mit ausgeliefert Indy Komponenten, installiert alle Updates für D2010. OS ist WinXP (32 Bit) SP3 mit den meisten Patches ...
Meine Zeit Routine ist:
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;
Mit dem Connect Set in Code I avg bekommen. Zeiten von 130-140ms, ohne das sie über die 5-15ms ...
Lösung
Wenn ConnectTimeout
Null (und TIdAntifreeze
nicht wirksam ist), Indy verbindet einfach. Andernfalls TIdIOHandlerStack.ConnectClient
ruft DoConnectTimeout
, die erstellt einen neuen Thread die Verbindungs ??während zu tun, der rufende Thread schläft und Prozesse TIdAntifreeze
Operationen, warten auf die Verbindung aufgebaut werden. Wenn es eine Verbindung nicht durch die Zeit, eine Ausnahme der Timeout abgelaufen ist, wirft es.
Themen sind nicht frei, und der anrufende Thread wird immer schlafen, bevor geprüft wird, ob die Verbindung Thread seine Aufgabe erfüllt hat. Die Standard-Schlafdauer ist 125 ms . (Gebrauch etwas anderes, aktivieren TIdAntifreeze
und legen Sie seine IdleTimeout
Eigenschaft als 125 senken.)