【发布时间】:2020-06-14 13:40:08
【问题描述】:
谁能帮我解决这个问题?
我正在努力提高效率,这就是我尝试并行计算的原因。 经过几次测试,结果告诉我没有什么比在 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 问题,目前只能作为解决方法解决。
【问题讨论】:
-
你能发一个minimal reproducible example吗?
-
那仍然不是minimal reproducible example。理想情况下,它应该是一个控制台应用程序,所有代码都在 .dpr 文件中,并且可以直接复制/粘贴和运行。还包括计时码。
-
完成,现在应该可以工作了。只需复制/粘贴到新项目中
-
您的 CPU 有多少个内核(不包括超线程)?
-
4 核,无 HT。
标签: multithreading performance sorting delphi utilization