Ostatnio próbuję ogarnąć wielowątkowość i wykorzystać ją do zwiększenia wydajności mojego silnika (głównie w zakresie renderowania). Napisałem sobie proste demko:
type
TTest = class(TThread)
procedure Execute; override;
end;
var
Test: array[0..4] of TTest;
C: Integer = 0;
F: Integer = 0;
Before, After: Int64;
procedure Loop;
var
I: Integer;
begin
for I := 0 to 1000 do Inc(F, 1);
Inc(C, 1);
if C = 5 then
begin
QueryPerformanceCounter(After);
ShowMessage(IntToStr(After - Before));
end;
end;
procedure TTest.Execute;
begin
Loop;
end;
procedure Start;
var
I: Integer;
begin
QueryPerformanceCounter(Before);
for I := 0 to 4 do Test[I].Resume;
end;
initialization
Test[0] := TTest.Create(True);
Test[1] := TTest.Create(True);
Test[2] := TTest.Create(True);
Test[3] := TTest.Create(True);
Test[4] := TTest.Create(True);
Kod jest oczywiście prymitywny i robi wiele rzeczy, których się robić nie powinno (np. użycie w taki sposób zmiennych globalnych), ale to tylko dla testu. Problem mam taki, że całość działa strasznie wolno i nie rozumiem dlaczego.
Przy wywołaniu tego samego kodu w pętli (a więc bez dodatkowych wątków)
for I := 0 to 4 do Loop;
jego wykonanie zajmuje jakieś 80-90 ticków procesora. Z wieloma wątkami... to zależy. Gdy odpalam apkę z debugowaniem, zajmuje to od 60000 do 90000 ticków. Bez debugowania od 1000 do 3000.
Moje pytania:
- Robię coś źle? Jeżeli tak, to gdzie popełniam błąd?
- Czemu występuje taka różnica w szybkości wykonywania kodu i to na niekorzyść wielowątkowości?
- Czemu debugowanie lub jego brak, aż tak drastycznie wpływa na wydajność? W przypadku wywołania kodu w zwykłej pętli, taki problem wydaje się nie występować.