delphi xe TParallel.For循环


本文整理自网络,侵删。

 
PPL使用内部线程池为TTask对象提供服务,并且该池根据您已安装的许多CPU和实际运行的任务数量进行自我调节和自我调整。在PPL文档中对此进行了解释:
RTL提供了并行编程库(PPL),使您的应用程序能够利用跨多个CPU设备和计算机的优势使任务并行运行。PPL包括许多高级功能,用于运行任务,加入任务,等待任务组等以进行处理。对于所有这一切,有一个线程池会自动自我调整(基于CPU的负载),因此您不必为此担心创建或管理线程。

从Delphi XE7开始,引入了全新的并行编程库用于简化并行编程,它位于System.Threading单元中。

下面是一个判断素数的简单例子:
function IsPrime (N: Integer): Boolean;
var
Test: Integer;
begin
IsPrime := True;
for Test := 2 to N - 1 do
if (N mod Test) = 0 then
begin
IsPrime := False;
break; {jump out of the for loop}
end;
end;

传统方式是循环按顺序逐个检测1到X间的数字,然后把总数存放到一个变量里(此处的Tot是一个Integer)
const
Max = 50000; // 50K

for I := 1 to Max do
begin
if IsPrime (I) then
Inc (Tot);
end;

使用新的并行库,此处可以把for语句替换为类函数TParallel.For,然后把要执行的代码放到匿名过程里,作为参数传递给它。
另外,因为现在是多线程运行,为了避免出现问题,还应当把Inc替换为TInterlocked.Increment

TParallel.For(1, Max, procedure (I: Integer)
begin
if IsPrime (I) then
TInterlocked.Increment (Tot);
end);

为了检查效率上的区别,我们可以使用System.Diagnostics单元的TStopWatch来测试各版本的运行时间。
在我的双核VM上,标准for循环用时415毫秒,并行for循环则用时192毫秒。
同样的测试在我的Mac上,标准for循环用时382毫秒,并行for循环用时90毫秒。

来源:https://tieba.baidu.com/p/3314069553?red_tag=0956087003

相关阅读 >>

Delphi2010中Delphi class explorer妙用

Delphi fdconnection1获取查询语句的第一个值

Delphi调用http接口方法

Delphi 有授权许可的字符串拷贝函数源码

Delphi 10.4中新增功能:新的vcl tedgebrowser组件

Delphi 获取系统的硬盘分区及使用信息

Delphi禁止用鼠标拖动窗口的大小

Delphi 写的经常用到的加解密函数

Delphi中的strpas功能

Delphi 校验文件大小

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...