Delphi: Pourquoi IdHTTP.ConnectTimeout faire des demandes plus lentes?
Question
J'ai découvert que lors de la mise la propriété ConnectTimeoout pour un composant TIdHTTP, il fait les demandes (GET et POST) deviennent plus lents sur les 120ms?
Pourquoi est-ce, et puis-je éviter / sautera cette certaine façon?
Env: D2010 avec des composants Indy expédiés, toutes les mises à jour installées pour D2010. OS est Windows XP (32 bits) SP3 avec la plupart des patches ...
Ma routine de synchronisation est:
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;
Avec l'ensemble ConnectTimeout dans le code que je reçois Avg. temps de 130-140ms, sans elle est à peu près 5-15ms ...
La solution
Lorsque ConnectTimeout
est égal à zéro (et TIdAntifreeze
est pas en vigueur), Indy se connecte simplement. Dans le cas contraire, TIdIOHandlerStack.ConnectClient
appelle DoConnectTimeout
, qui crée un nouveau thread pour faire la connexion alors que le thread appelant dort et les processus TIdAntifreeze
opérations, en attendant que la connexion soit établie. S'il n'y a pas de connexion au moment où le délai d'attente écoulé de, il renvoie une exception.
Fils ne sont pas libres, et le fil appelant sera toujours le sommeil avant de vérifier si le fil de connexion a accompli sa tâche. La durée du sommeil par défaut est 125 ms . (Utiliser quelque chose d'autre, activer TIdAntifreeze
et définissez sa propriété IdleTimeout
inférieure à 125.)