In dem Zusammenhang ist mir jetzt aufgefallen, dass das Erzeugen einer TIdHTTP-Instanz eine Menge Zeit fressen kann. Das ergibt bei folgendem kleinen Test interessante Messwerte:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
tasks: array of ITask;
I: Integer;
Startzeit: Integer;
begin
Startzeit := GetTickCount;
SetLength(tasks, 40);
for I := Low (tasks) to High (tasks) do
begin
tasks[I] := TTask.Create (procedure ()
var
HTTP: TIdHTTP;
S: string;
begin
HTTP := TIdHTTP.Create(NIL);
try
HTTP.Get('http://irgendeinserver.de/');
finally
HTTP.Free;
end;
end);
tasks[I].Start;
end;
TTask.WaitForAll(tasks);
Memo1.Lines.Add('Das Ausführen dauerte '+IntToStr(GetTickCount - Startzeit)+' Ticks');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
HTTP: TIdHTTP;
Startzeit: Integer;
S: string;
I: Integer;
begin
Startzeit := GetTickCount;
HTTP := TIdHTTP.Create;
try
for I := 1 to 40 do begin
S := HTTP.Get('http://irgendeinserver.de/');
end;
finally
FreeAndNil(HTTP);
end;
Memo1.Lines.Add('Das Ausführen dauerte '+IntToStr(GetTickCount - Startzeit)+' Ticks');
end;
procedure TForm1.Button3Click(Sender: TObject);
var
HTTP: TIdHTTP;
Startzeit: Integer;
S: string;
I: Integer;
begin
Startzeit := GetTickCount;
for I := 1 to 40 do begin
HTTP := TIdHTTP.Create;
try
S := HTTP.Get('http://irgendeinserver.de/');
finally
FreeAndNil(HTTP);
end;
end;
Memo1.Lines.Add('Das Ausführen dauerte '+IntToStr(GetTickCount - Startzeit)+' Ticks');
end;
Button 1: 300 bis ~3000 Ticks (im Mittel 1100 Ticks)
Button 2: ~1500 Ticks
Button 3: ~3000 Ticks
Besonders aus den letzteren beiden Varianten ohne Multithreading lässt sich ableiten, dass das Erzeugen vom TIdHTTP-Objekt bei einem seriellen Ablauf und halbwegs flottem Server die Laufzeit in etwa verdoppelt bzw. das Erzeugen genauso lang dauert wie der HTTP-Request selbst. Die genannten Zahlen habe ich aus jeweils 10 Durchläufen a 40 Abrufen ermittelt.
Da ich aber in der Multithreading-Variante das Objekt nicht mehrfach verwenden kann, muss ich zwangsläufig für jeden Task ein eigenes TIdHTTP erzeugen. Dadurch relativiert sich Aufwand und Nutzen zwischen der Variante 1 (mit Threading) und Variante 2 (seriell mit einmal erzeugter TIdHTTP-Instanz) doch ganz erheblich. Wobei ich noch nicht dahinter gekommen bin woher die enorme Streubreite bei Variante 1 kommt. An Serverlatenzen liegt es nicht, das sieht man an den seriellen Varianten, da reagiert der sehr konstant.
PS: "http://irgendeinserver.de/" müsst ihr ersetzen durch einen Testerver eurer Wahl.