gpt4 book ai didi

multithreading - 德尔福 2010 : No thread vs threads

转载 作者:行者123 更新时间:2023-12-03 18:15:25 25 4
gpt4 key购买 nike

我是 delphi 2010 的用户,我目前的机器是 intel core i7,运行 windows 7 x64。我写了以下代码:

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FCount: Integer;
FTickCount: Cardinal;
procedure DoTest;
procedure OnTerminate(Sender: TObject);
end;

TMyThread = class(TThread)
private
FMethod: TProc;
protected
procedure Execute; override;
public
constructor Create(const aCreateSuspended: Boolean; const aMethod: TProc);
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
T1, T2: Cardinal;
begin
T1 := GetTickCount;
for i := 0 to 9 do
DoTest;
T2 := GetTickCount;
Memo1.Lines.Add(Format('no thread=%4f', [(T2 - T1)/1000]));
end;

procedure TForm1.Button2Click(Sender: TObject);
var T: TMyThread;
i: integer;
begin
FCount := 0;
FTickCount := GetTickCount;

for i := 0 to 9 do begin
T := TMyThread.Create(True, DoTest);
T.OnTerminate := OnTerminate;
T.Priority := tpTimeCritical;

if SetThreadAffinityMask(T.Handle, 1 shl (i mod 8)) = 0 then
raise Exception.Create(IntToStr(GetLastError));

Inc(FCount);
T.Start;
end;
end;

procedure TForm1.DoTest;
var i: integer;
begin
for i := 1 to 10000000 do
IntToStr(i);
end;

procedure TForm1.OnTerminate(Sender: TObject);
begin
Dec(FCount);
if FCount = 0 then
Memo1.Lines.Add(Format('thread=%4f', [(GetTickCount - FTickCount)/1000]));
end;

constructor TMyThread.Create(const aCreateSuspended: Boolean; const aMethod:
TProc);
begin
inherited Create(aCreateSuspended);
FMethod := aMethod;
FreeOnTerminate := True;
end;

procedure TMyThread.Execute;
begin
FMethod;
end;

点击 Button1 将显示 12.25 秒,而 Button2 将显示 12.14 秒。我的问题是为什么我在运行并行线程时无法获得更明显的时间差异(少于 10 秒)?

最佳答案

内存分配似乎是这里的主要问题。

如果您将负载替换为

procedure TForm6.DoTest;
var i: integer;
a: double;
begin
a := 0;
for i := 1 to 10000000 do
a := Cos(a);
end;

代码将很好地并行化,表明您的框架没有真正的问题。

但是,如果您用内存分配/解除分配替换负载

procedure TForm6.DoTest;
var i: integer;
p: pointer;
begin
for i := 1 to 10000000 do begin
GetMem(p, 10);
FreeMem(p);
end;
end;

并行版本将比单线程版本运行得慢得多。

调用 IntToStr 时,会分配和销毁一个临时字符串,这种分配/取消分配会造成瓶颈。

BTW1:除非您真的知道自己在做什么,否则我强烈建议不要以 tpTimeCritical 优先级运行线程。即使您真的知道自己在做什么,也不应该那样做。

BTW2:除非你真的知道你在做什么,否则你不应该在线程级别上混淆亲和性掩码。系统足够智能,可以很好地调度线程。

关于multithreading - 德尔福 2010 : No thread vs threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3632945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com