delphi - 哪种处理记录数组的方法更有效?

标签 delphi

什么是更有效的方法?

FUserRecords[I].CurrentInput:=FUserRecords[I].CurrentInput+typedWords;

var userRec: TUserRec;
...
userRec:=FUserRecords[I];
userRec.CurrentInput:=userRec.CurrentInput+typedWords;
FUserRecords[I]:=userRec;

最佳答案

在您所描述的情况下,第一个示例将是最有效的。

记录是值类型,因此当您执行此行时:

userRec:=FUserRecords[I];

您实际上是将数组中记录的内容复制到局部变量中。当你执行相反的操作时,你就是在再次复制信息。如果您要迭代数组,并且数组和记录非常大,那么最终可能会非常慢。

如果您想走第二条路,为了加快速度,您可以使用指向记录的指针直接操作数组中的记录,如下所示:

type
  TUserRec = record
    CurrentInput: string;
  end;
  PUserRec = ^TUserRec;

var
  LUserRec: PUserRec;
...
LUserRec := @FUserRecords[I];
LUserRec^.CurrentInput := LUserRec^.CurrentInput + typedWords;

(正如评论中所讨论的,插入符号 (^) 是可选的。我只是为了完整性才在此处添加它们)。

当然,我应该指出,只有在确实存在性能问题时才需要这样做。在手动编写此类优化代码之前,最好先分析一下您的应用程序。

编辑:关于您正在查看的性能问题的所有讨论的一个警告是,如果记录中的大部分数据都是字符串,那么您所拥有的示例中的大部分性能都会损失显示将在字符串连接中,而不是在记录操作中。

此外,字符串基本上作为指针存储在记录中,因此记录实际上是任何整数等的大小,加上字符串指针的大小。因此,当您连接到字符串时,它不会增加记录大小。您基本上可以将代码中的字符串操作部分视为记录操作的一个单独问题。

您在下面的评论中提到,这是为了存储来自多个键盘的输入,我无法想象您的数组中会有超过 5-10 个项目。在这样的规模下,执行这些步骤来优化代码并不会真正提高速度那么多。

我相信您的第一个示例和上面使用指针的代码最终都会获得大致相同的性能。您应该使用最容易阅读和理解的那个。

N@

关于delphi - 哪种处理记录数组的方法更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3183391/

相关文章:

德尔福XE2 : iterate actions in a TAcionManager object

android - Android 上的 Delphi XE5 串口

xml - MSXML 替代品

delphi - 如何以编程方式更改特定显示器的分辨率?

c# - 为什么我宁愿使用 native dll 或 com 服务器从 C# 调用 Delphi 代码?

multithreading - 如何保持线程的消息泵 react 性

delphi - 在 Delphi 中,在 Excel Interop Worksheets 集合上使用 for 循环时,如何处理 "no GetEnumerator present"错误?

multithreading - 计时和 VCL 同步(在线程中/从线程中)

delphi - 如何在设计时获取表单上所有组件的列表?

delphi - 优化 TWebBrowser 的绘制以减少总 CPU 使用率