誰でもこの問題を解決できますか?
私はより多くの効率を達成しようとしているので、計算を並列化しようとしました。いくつかのテストの結果、1 スレッドでの計算よりも高速なものはないことがわかりました。両方の場合 (1 スレッドと 4 スレッド) のプロセッサ負荷はわずか 25% です。なぜそれが起こっているのか誰にも分かりますか?100% の効率を達成するためにできることはありますか (90% であっても 25% よりも優れています)。
以下にコード例を示します。
ToolsThread = class(TThread)
public
procedure Execute(); override;
procedure QuickSortT(var dict: TArray<AnsiString>; iLo, iHi: Integer);
Procedure QSortT(var dict: TArray<AnsiString>);
constructor Create();
var
tab : TArray<AnsiString>;
tmp1: Longint;
end;
procedure ToolsThread.QuickSortT(var dict: TArray<AnsiString>; iLo, iHi: Integer);
var
Lo, Hi: Longint;
Pivot: Pointer;
T: Pointer;
begin
Lo := iLo;
Hi := iHi;
Pivot := pointer(dict[(Lo + Hi) shr 1]); // shr 1 is slightly faster than div 2;
repeat
while dict[Lo] < AnsiString(Pivot) do Inc(Lo);
while dict[Hi] > AnsiString(Pivot) do Dec(Hi);
if Lo <= Hi then
begin
T := pointer(dict[Lo]);
pointer(dict[Lo]) := pointer(dict[Hi]);
pointer(dict[Hi]) := T;
Inc(Lo) ;
Dec(Hi) ;
end;
until Lo > Hi;
if Hi > iLo then QuickSort(dict, iLo, Hi) ;
if Lo < iHi then QuickSort(dict, Lo, iHi) ;
end;
Procedure ToolsThread.QSortT(var dict: TArray<AnsiString>);
begin
QuickSort(dict, 0, Length(dict)-1);
end;
procedure ToolsThread.Execute();
var
tmp1, tmp2 : Longint;
dict: TArray<AnsiString>;
begin
SetLength(dict, 10000000);
for tmp1:= 0 to 10000000-1 do
dict[tmp1] := IntToStr(Random(high(integer)));
QSortT(dict);
end;
Procedure Main;
var
Th1, Th2, Th3, Th4: ToolsThread;
begin
Th1 := ToolsThread.Create();
Th2 := ToolsThread.Create();
Th3 := ToolsThread.Create();
Th4 := ToolsThread.Create();
debug('Start THR');
Th1.Start;
Th2.Start;
Th3.Start;
Th4.Start;
th1.WaitFor;
th2.WaitFor;
th3.WaitFor;
th4.WaitFor;
debug('THR Done');
end;
提案に従って修正しました。依然として 25% の CPU 負荷 (スレッドあたり 5 ~ 8%)
解決しました!マルチプロセッシングでの一部の Delphi メモリ管理には、一般的な問題があります。これは fastMM4 の問題ではなく、現時点では回避策としてのみ解決可能です。