Delphi xe7并行编程快速入门(三篇)
现在多数设备、计算机都有多个CPU单元,即使是手机也是多核的。但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码。好了,现在可以使用Delphi做并行编程了。
在Delphi、C++ Builder和RAD Studio XE7中,有一个简化并行运行任务的库,叫做并行编程库。
并行编程库在System.Threading单元中,其中提供了很多有用的特性,可方便的应用在已有项目和新项目中。提供了大量便利的重载函数,可同时支持C++和Object Pascal。
这些特性包括易用的针对循环的并行运算,以及对运行任务、join任务(等待其他线程完成)、等待一组任务等操作提供支持的大量高级特性。支持这些功能的是一个自我管理的线程池(基于CPU数量)。
为了演示使用并行库的简易程度,我们写一个计算质数的范例。
function IsPrime (N: Integer): Boolean;
var
Test: Integer;
begin
Result := True;
for Test := 2 to N - 1 do
if (N mod Test) = 0 then
begin
Result := False;
break; {jump out of the for loop}
end;
end;
获取从1到X的质数个数的典型算法是顺序的循环检查其中的每个数,将总数记录在一个变量中(这里是一个整数Tot)。
const
Max = 50000; // 50K
for I := 1 to Max do
begin
if IsPrime (I) then
Inc (Tot);
end;
使用新的并行库,可把for循环用类函数TParallel.For替代,并传递一个匿名方法。
另外为避免多线程冲突,可以调用TInterlocked.Increment。
TParallel.For(1, Max, procedure (I: Integer)
begin
if IsPrime (I) then
TInterlocked.Increment (Tot);
end);
有哪些改进?
使用System.Diagnostics单元的TStopWatch类可以方便的获取每种循环的运行时间。即使在2核虚拟机中运行,标准循环用时415ms,而并行只需192ms。在Mac上时间从382ms降到90ms。
最让人喜爱的地方是,作为语言和框架的一部分,可非常容易的加入到现有代码中。
在开发原生代码的时候可以利用多核设备(包括移动设备)的优势。然而,在移动设备上过多运行多线程会消耗更多电量。
Samples
其他并行编程库的范例可见Delphi和C++自带的Conways游戏范例:
C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\Object Pascal\RTL\Parallel Library
C:\Users\Public\Documents\Embarcadero\Studio\15.0\Samples\CPP\RTL\Parallel Library
不知道你感觉怎么样,我已经使用并行库将我的旧程序提速了,编程快乐。
http://blog.csdn.net/henreash/article/details/41315183
http://blog.csdn.net/henreash/article/details/41349145
http://blog.csdn.net/henreash/article/details/41347843
Delphi xe7并行编程快速入门(三篇)的更多相关文章
- [转载]:Delphi xe7并行编程快速入门
现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...
- Delphi xe7并行编程快速入门(转)
源:http://blog.csdn.net/henreash/article/details/41315183 现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优 ...
- Delphi XE7并行编程: 并行For循环
从Delphi XE7开始,引入了全新的并行编程库用于简化并行编程,它位于System.Threading单元中. 下面是一个判断素数的简单例子:function IsPrime (N: Intege ...
- 版本控制工具Git工具快速入门-Linux篇
版本控制工具Git工具快速入门-Linux篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.版本管理系统的介绍 1>.版本管理系统的特点 1.1>.自动生成备份: ...
- 版本控制工具Git工具快速入门-Windows篇
版本控制工具Git工具快速入门-Windows篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近在学习Golang语言,之前的开发环境在linux上开发的,后来由于办公用的是w ...
- COM编程快速入门
COM编程快速入门 COM编程快速入门 http://www.vckbase.com/index.php/wv/1642 COM是一种跨应用和语言共享二进制代码的方法.与C++不同,它提倡源代码重 ...
- .Net Core WebAPI 基于Task的同步&异步编程快速入门
.Net Core WebAPI 基于Task的同步&异步编程快速入门 Task.Result async & await 总结 并行任务(Task)以及基于Task的异步编程(asy ...
- 并发编程之第三篇(synchronized)
并发编程之第三篇(synchronized) 3. 自旋优化 4. 偏向锁 撤销-其它线程使用对象 撤销-调用wait/notify 批量重偏向 批量撤销 5. 锁消除 4.7 wait/notify ...
- 实体框架(Entity Framework)快速入门--实例篇
在上一篇 <实体框架(Entity Framework)快速入门> 中我们简单了解的EF的定义和大体的情况,我们通过一步一步的做一个简单的实际例子来让大家对EF使用有个简单印象,看操作步骤 ...
随机推荐
- JavaScript下全选反选的Demo程序里实现checkmeonly函数 DOM
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java--局部类只能访问外包方法的final局部成员
class B523{ // private int k = 10; public void go(int x, final int y){ // int a = x+y; final int b = ...
- python中eval, exec, execfile,和compile [转载]
eval(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值,并返回计算结果. 同样地, exec语句将字符串str当成有效Python代码来执行. ...
- 【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码
原文:[项目分析]利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码 最近正在进行项目服务的移植工作,即将JAVA服务的程序移植到DotNet平台中. 在JAVA程 ...
- docker学习笔记2:容器操作
一.列出主机上已经创建的容器 docker ps -a 二.创建交互式容器 命令: docker run -i -t ubuntu /bin/bash 其中-i -t 表示创建一个提供交互式shell ...
- 获取浏览器版本Asp.Net
public static string GetBrowser() { HttpBrowserCapabilities bc = HttpContext.Current.Request.Browser ...
- 基于visual Studio2013解决C语言竞赛题之1007找数
题目 解决代码及点评 /************************************************************************/ ...
- IP数据报首部校验和算法
当用google搜索IP数据报首部校验和算法的时候,总是看到的是代码,没有看到其过程,于是就有了此文,如有错误请指正.文章省略一点,呵呵 IP/ICMP/IGMP/TCP/UDP等协议的校验和算法 ...
- 遭遇“HTTP 错误 500.19 无法访问请求的页面,因为该页的相关配置数据无效。”
windows 2008下IIS7 安装ASP.NET 遇到如下错误: HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效. ...
- Sed常用实例总结
[Sed简介] sed是一个文件处理工具,本身是一个管道命令,主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等.sed以行为单位,一次处理一行内容,处理时,把当前处理的行存储在临时 ...