【Delphi】使用并行数组和有序字典加快 Delphi RTL 速度(D12.2)

Delphi 12.2新增功能比较多,但 Delphi 运行时库(RTL)中的一些增强功能值得一提。比如:

新 TParallelArray 类

        System.Threading 单元中有一个新的 TParallelArray 类,可以在数组项上并行运行 &For 和排序等操作。 在多核系统中,这可以大大提高运行速度。 如何使用? 这是一个简单的测试用例、命令行项目,它创建了两个完全相同的数组,并使用常规的单线程排序和新的并行版本进行排序:

program ParallelArray;{$APPTYPE CONSOLE}{$R *.res}usesSystem.SysUtils,System.Classes,System.Generics.Collections,System.Threading,System.Diagnostics;varA1, A2: array of Integer;I: Integer;T: TStopwatch;begintrySetLength(A1, 100_000_000);SetLength(A2, 100_000_000);for I := 0 to High(A1) dobeginA1[I] := Random(MaxInt);A2[I] := A1[I];end;// Warm up thread poolTTask.Create(procedurebegin// emptyend).Start;// Serial sortingT := TStopwatch.StartNew;TArray.Sort<Integer>(A1);T.Stop;Writeln('TArray.Sort: ', T.Elapsed.ToString);// Parallel sortingT := TStopwatch.StartNew;TParallelArray.Sort<Integer>(A2);T.Stop;Writeln('TParallelArray.Sort: ', T.Elapsed.ToString);excepton E: Exception doWriteln(E.ClassName, ': ', E.Message);end;Readln;
end.

如果在我的主电脑(英特尔(R)酷睿(TM)i7-10700 处理器,主频为 2.90GHz )上运行它,会得到以下结果,性能提高了 585%! (为便于阅读,输出结果已缩减为毫秒级)

TArray.Sort: 00:00:16.414
TParallelArray.Sort: 00:00:02.889

新的 TOrderedDictionary 类

        System.Generics.Collections 单元中还有一个从 TDictionary<K,V> 派生的新 TOrderedDictionary 类。 有序字典是在字典中集成了排序方法的字典。 这使得 for in 循环以排序顺序浏览数据变得简单,也使查找元素变得更快。 举例来说,请看下面的项目:

  • 创建一个有序字典并添加一些元素
  • 显示输出结果以及查找一个键 1 亿次所需的时间
  • 按键排序,再次显示输出结果并重复 1 亿次查找调用(快得多!)
  • 按值排序,再次显示
  • 添加一个额外的元素,以证明元素不会随排序顺序添加,您需要根据需要进行调整(插入多个元素时,这种方法通常更快)。
program OrderedDictionaryDemo;{$APPTYPE CONSOLE}{$R *.res}usesSystem.SysUtils,System.Generics.Collections,System.Diagnostics;varT: TStopwatch;begintryvar ODict := TOrderedDictionary <string, string>.Create;ODict.Add ('one', 'London');ODict.Add ('two', 'Berlin');ODict.Add ('three', 'Rome');ODict.Add ('four', 'Athens');ODict.Add ('five', 'Madrid');ODict.Add ('six', 'Bruxelles');ODict.Add ('seven', 'Paris');writeln ('Natural');for var APair in ODict dowriteln (APair.Key + ' - ' + APair.Value);T := TStopwatch.StartNew;for var I := 0 to 100_000_000 doODict.IndexOf('five');T.Stop;Writeln('IndexOf unsorted: ', T.Elapsed.ToString);writeln;writeln ('SortByKeys');ODict.SortByKeys;for var APair in ODict dowriteln (APair.Key + ' - ' + APair.Value);T := TStopwatch.StartNew;for var I := 0 to 100_000_000 doODict.IndexOf('five');T.Stop;Writeln('IndexOf sorted: ', T.Elapsed.ToString);writeln;writeln ('SortByValues');ODict.SortByValues;for var APair in ODict dowriteln (APair.Key + ' - ' + APair.Value);writeln;writeln ('SortByValues plus extra item');ODict.Add ('eight', 'Prague');for var APair in ODict dowriteln (APair.Key + ' - ' + APair.Value);writeln;readln;excepton E: Exception doWriteln(E.ClassName, ': ', E.Message);end;
end.

这是完整的输出结果:

Natural
one - London
two - Berlin
three - Rome
four - Athens
five - Madrid
six - Bruxelles
seven - Paris
IndexOf unsorted: 00:00:01.2720716SortByKeys
five - Madrid
four - Athens
one - London
seven - Paris
six - Bruxelles
three - Rome
two - Berlin
IndexOf sorted: 00:00:00.6366114SortByValues
four - Athens
two - Berlin
six - Bruxelles
one - London
five - Madrid
seven - Paris
three - RomeSortByValues plus extra item
four - Athens
two - Berlin
six - Bruxelles
one - London
five - Madrid
seven - Paris
three - Rome
eight - Prague

更多 RTL 增强功能

  1. 通过改进 rdMultiString 支持和新方法 ReadNone 和 WriteNone(映射到 REG_NONE Windows 注册表数据类型),扩展了 TRegistry 类。
  2. 改进了 System.DateUtils.RFC822 中的日期支持。
  3. 现在为随 RAD Studio 发布的 Delphi 运行时包提供映射文件

本篇博文就写到这里,希望您能在自己的项目中开始利用这些功能以及最近发布的版本中新增的许多其他 RTL 功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559460.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【有啥问啥】 群体智能(Swarm Intelligence):从自然到人工智能的深度探索

群体智能&#xff08;Swarm Intelligence&#xff09;&#xff1a;从自然到人工智能的深度探索 什么是群体智能&#xff1f; 群体智能&#xff08;Swarm Intelligence&#xff09;是一个迷人的研究领域&#xff0c;它专注于社会性生物&#xff08;如蚂蚁、蜜蜂、鸟类等&#…

ML 系列:机器学习和深度学习的深层次总结(16) — 提高 KNN 效率-使用 KD 树和球树实现更快的算法

一、说明 在机器学习系列的第 16 节&#xff0c;我们重点介绍了提高 K 最近邻 &#xff08;KNN&#xff09; 算法的效率&#xff0c;这是一种广泛用于分类和回归任务的方法。虽然 KNN 简单有效&#xff0c;但对于大型数据集来说&#xff0c;其计算成本可能会令人望而却步。为了…

实验室认证需要准备哪些文件材料?

实验室认证需要准备的文件材料通常包括以下几类&#xff1a; 一、法律地位文件 实验室成立文件及营业执照&#xff1a;包括实验室的成立证明文件、单位营业执照等&#xff0c;以证明实验室的法律地位和合法性。 人员任命文件&#xff1a;最高管理者&#xff08;如总经理&…

Android 10.0 修改Systemui三键导航栏虚拟按键颜色功能实现

1.前言 在10.0的系统ROM定制化开发中,在对systemui的相关定制化开发中,在某些产品中,需要修改相关的 导航栏三键导航的虚拟按键的颜色,修改掉原来默认的虚拟按键的黑白色,接下来就来实现相关的功能 2.修改Systemui三键导航栏虚拟按键颜色功能实现的核心类 frameworks\ba…

图像处理(一)——CMC特刊推荐

特刊征稿 01 期刊名称&#xff1a; Data and Image Processing in Intelligent Information Systems 截止时间&#xff1a; 提交截止日期:2024年11月15日 目标及范围&#xff1a; 感兴趣的主题包括但不限于&#xff1a; 先进的数据处理技术; 智能数据分析; 智能系统…

【芯智雲城】Nanya车规DRAM存储解决方案

一、车规级芯片的特点&#xff1a; 汽车电子零部件的关键因素是以下两点&#xff1a; 1、可靠性&#xff08;Reliability&#xff09;&#xff1a;要求部件必须能够承受日常使用的严酷和极端的温度、湿度、机械振动、冲击及车辆的复杂电气和电磁环境。 AEC-Q100对汽车零件工…

ARMv7/v8m GCC Compilation

00-Guide01-Toolchains02-GNU binutils03-ELF file04-Compilation process05-CFLAGS options06- Linker Scripts07 -Link Options08-Map file09-Static and dynamic lib10-Secureboot and image11-Builtin functions12-Function Attributes

聚合数字力量,数字产业集团构建产业互联新平台!

在数字经济蓬勃发展的今天&#xff0c;数字产业集团正以其强大的聚合力&#xff0c;引领着一场前所未有的产业互联革命。近日&#xff0c;中国信息协会产业互联网分会发布的《中国产业互联网平台数据地图》显示&#xff0c;全国已有超过1000家产业互联网平台企业&#xff0c;覆…

Kubernetes简介与部署+Pod管理与优化

一、简介 1.基础信息 在Docker 作为高级容器引擎快速发展的同时&#xff0c;在Google内部&#xff0c;容器技术已经应用了很多年Borg系统运行管理着成干上万的容器应用。Kubernetes项目来源于Borg&#xff0c;可以说是集结了Borg设计思想的精华&#xff0c;并且吸收了Borg系统…

易泊车牌识别在 4S 店的应用

在当今数字化时代&#xff0c;车牌识别技术正逐渐成为各个行业提高效率和服务质量的重要工具。其中&#xff0c;易泊车牌识别系统在 4S 店中发挥着重要作用。 一、快速车辆登记 当客户驾车来到 4S 店时&#xff0c;易泊车牌识别系统能够迅速识别车牌号码&#xff0c;自动将车辆…

GPT-SOVIT模型部署指南

一、模型介绍 强大的小样本语音转换和文本转语音 WebUI。 具有以下特征&#xff1a; 零样本 TTS&#xff1a; 输入 5 秒的声音样本并体验即时文本到语音的转换。少量样本 TTS&#xff1a; 仅使用 1 分钟的训练数据对模型进行微调&#xff0c;以提高语音相似度和真实感。跨语…

历时一个多月,搭建了一款培训考试小程序系统

前不久&#xff0c;一位在机构单位工作的朋友联系到我&#xff0c;说他们需要搭建一款内部培训考试系统&#xff0c;是关于安全知识学习与考试的。 此处省略好多张聊天页...... 为此&#xff0c;针对用户的需求&#xff0c;在搭建前&#xff0c;我做了大量的竞品分析&#xff…

MediaPlayer视频播放流程

MediaPlayer视频播放流程(基于Android8.0) 1. MediaPlayer源码分析 1.0 public class MediaPlayer extends PlayerBase implements SubtitleController.Listener, VolumeAutomation, AudioRoutingMediaPayer继承自PlayerBase类&#xff0c;分别实现了SubtitleController Volume…

带外管理卡虚拟控制台连接总结--持续更新

为避免维护服务器、小型机为连接虚拟控制台&#xff0c;采用的办法不对而导致浪费时间&#xff0c;特做以下总结&#xff1a; ##1、DELL PowerEdge R510 idrac 6(intergrated dell remote access contoller 6) server 2003 R2 SP2 用chomre 版本 47.0.2526.80 m打开https://…

C++:thread | condition_variable|mutex

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言thread创建线程传递参数给线程函数 mutexmutex常见用法 condition_variable&#xff1a;条件变量生产消费模型 引言 相信大家在Linux系统编程中都接触过线程创建和退出的相关系统调用&#xff0…

【数据结构与算法】简单聊聊图数据的存储

文章目录 1. 邻接矩阵&#xff08;Adjacency Matrix&#xff09;2. 邻接表&#xff08;Adjacency List&#xff09;3. 邻接多重表4. 十字链表5. 图数据库&#xff08;Graph Database&#xff09; 存储图数据的方法主要有几种&#xff0c;每种方法都有其特定的应用场景和优缺点。…

毕业设计项目-古典舞在线交流平台的设计与实现(源码/论文)

项目简介 基于springboot实现的&#xff0c;主要功能如下&#xff1a; 技术栈 后端框框&#xff1a;springboot/mybatis 前端框架&#xff1a;html/JavaScript/Css/vue/elementui 运行环境&#xff1a;JDK1.8/MySQL5.7/idea&#xff08;可选&#xff09;/Maven3&#xff08…

什么是物联网nb水表?

物联网NB水表是一种利用NB-IoT(窄带物联网)技术实现远程数据传输的智能水表。这种水表不仅能够精确计量用户的用水量&#xff0c;还能通过无线通信技术实现数据的远程传输和管理。下面我们来详细介绍物联网NB水表的主要特点和功能。 一、基本概念 -定义&#xff1a;物联网NB水…

如何优化spotbugsXml.xml文件来方便debug的落地方案来了

不优化的spotbugsXml.xml 使用maven 构建来运行spotbugs的小伙伴都知道&#xff0c;执行完下面的命令后 mvn clean install -U spotbugs:spotbugs 会在默认的在target目录下生成一个spotbugsXml.xml 文件&#xff0c;而打开这个文件&#xff0c;想要debug里面的具体问题&am…

嵌入式面试——FreeRTOS篇(六) 任务通知

本篇为&#xff1a;FreeRTOS 任务通知篇 任务通知简介 1、任务通知介绍 答&#xff1a; 任务通知&#xff1a;用来通知任务的&#xff0c;任务控制块中的结构体成员变量ulNotifiedValue就是这个通知值。 使用队列、信号量、事件标志组时都需要另外创建一个结构体&#xff0c…