gpt4 book ai didi

multithreading - Delphi并行处理字符串完全可用CPU使用率

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

目标是在单个 Delphi 应用程序中将 float 转换为字符串时充分利用可用内核。我认为这个问题适用于字符串的一般处理。但在我的示例中,我专门使用了 FloatToStr 方法。

我正在做什么(我保持了非常简单的态度,因此实现过程中几乎没有歧义):

  • 使用德尔福XE6
  • 创建继承自TThread的线程对象,并启动它们。
  • 在线程执行过程中会转换大量的通过 FloatToStr 方法双倍转换为字符串。
  • 为了简化,这些 double 只是相同的常量,因此没有线程所需的共享或全局内存资源。

尽管使用了多个核心,但 CPU 使用率百分比始终会超出单个核心的数量。我知道这是一个既定的问题。所以我有一些具体问题。

以一种简单的方式,相同的操作可以由多个应用程序实例完成,从而更充分地利用可用的 CPU。是否可以在同一个可执行文件中有效地执行此操作?IE。在操作系统级别或操作系统识别的某些等效分区上为线程分配不同的进程ID?或者这在开箱即用的 Delphi 中根本不可能实现?

范围:我知道有不同的内存管理器可用,其他组已尝试更改一些较低级别的 asm 锁使用 http://synopse.info/forum/viewtopic.php?id=57但是,我是在不做这么低层次的事情的范围内问这个问题的。

谢谢

<小时/>

嗨,J。我的代码故意非常简单:

TTaskThread = class(TThread)
public
procedure Execute; override;
end;

procedure TTaskThread.Execute;
var
i: integer;
begin
Self.FreeOnTerminate := True;
for i := 0 to 1000000000 do
FloatToStr(i*1.31234);
end;

procedure TfrmMain.Button1Click(Sender: TObject);
var
t1, t2, t3: TTaskThread;
begin
t1 := TTaskThread.Create(True);
t2 := TTaskThread.Create(True);
t3 := TTaskThread.Create(True);
t1.Start;
t2.Start;
t3.Start;
end;

这是一个“测试代码”,其中 CPU(通过性能监视器)最大为 25%(我有 4 个核心)。如果 FloatToStr 行被交换为非字符串操作,例如Power(i, 2),然后性能监视器显示预期的 75% 使用率。(是的,有更好的方法来衡量这一点,但我认为这对于这个问题的范围来说已经足够了)

我已经相当彻底地探讨了这个问题。提问的目的是想以一种非常简单的形式提出问题的症结。

我询问使用 FloatToStr 方法时的限制。并询问是否有一个实现化身可以允许更好地使用可用内核。

谢谢。

最佳答案

我赞同其他人在评论中所说的话。 FastMM 内存管理器不可扩展,这是 Delphi 的肮脏小 secret 之一。

由于内存管理器可以被替换,您可以简单地用可扩展的内存管理器替换 FastMM。这是一个快速变化的领域。每隔几个月就会出现新的可扩展内存管理器。问题是很难编写一个正确的可扩展内存管理器。你准备相信什么? FastMM 值得称赞的一件事是它非常强大。

与其更换内存管理器,不如更换需要更换的内存管理器。只需避免堆分配即可。找到一种方法来完成需要重复调​​用来分配动态内存的工作。即使您有一个可扩展的堆管理器,堆分配仍然会产生成本。

一旦您决定避免堆分配,下一个决定就是使用什么来代替 FloatToStr。根据我的经验,Delphi 运行时库不提供太多支持。例如,我最近发现没有好的方法可以使用调用者提供的缓冲区将整数转换为文本。因此,您可能需要推出自己的转换函数。作为证明这一点的简单第一步,尝试从 msvcrt.dll 调用 sprintf。这将提供概念证明。

关于multithreading - Delphi并行处理字符串完全可用CPU使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28079372/

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