什么是更有效的方法?
FUserRecords[I].CurrentInput:=FUserRecords[I].CurrentInput+typedWords;
或
var userRec: TUserRec;
...
userRec:=FUserRecords[I];
userRec.CurrentInput:=userRec.CurrentInput+typedWords;
FUserRecords[I]:=userRec;
答案 0 :(得分:10)
在您描述的情况下,第一个示例将是最有效的。
记录是值类型,因此当您执行此行时:
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 - [
答案 1 :(得分:1)
更快,更易读:
with FUserRecords[I] do
CurrentInput := CurrentInput + typedWords;