我正在重构一个Inno Setup项目,对我来说不太清楚的是
使用TArrayOfString,String和TStringList数组。这三种类型有什么不同?
据我所知,它的使用似乎没有区别。所有三个存储字符串,我可以使用数组\ list获取存储的字符串,如下所示:arrayName[i]
。
当使用其中一个时,一个更快还是被认为是错误的编码? 我希望有人能在这件事上给我一些清晰的信息。
答案 0 :(得分:10)
TArrayOfString
类型是array of string
的别名,因此它们等于(您可以在源代码中see it here
)。 TStringList
类是一个索引字符串集合类,其存储内部是一个记录数组。但是字符串数组和TStringList
类之间存在很大差异。
array of string
只是字符串元素的索引存储,而TStringList
类是一个集合类,为多个内容处理任务提供选项和方法(例如消除重复,排序,搜索等) )。
如果我们忘记TStringList
类提供的方法并将其视为存储,那么我们必须关注如何在应用程序中将字符串元素添加到应用程序中的方式比较表现。
通常,只要您不经常调整数组大小,array
类型就会更快。这在频繁调用时添加单个元素效率不高:
procedure AddSingleElement(var A: array of string; const S: string);
begin
SetArrayLength(A, GetArrayLength(A) + 1);
A[High(A)] := S;
end;
那是因为重新分配了保存数组的内存。这花费了一些时间。但是如果你不经常设置数组长度,你可以防止这个瓶颈。理想情况是当您将数组长度设置为目标长度一次时(这需要事先知道元素计数)。
改进上述代码的另一个选项(当你事先不知道元素的数量时)是通过几个元素预先分配数组长度。这将减少重新分配的数量,但也要求您记住并使用长度来操作,该长度意味着逻辑,实际数组长度。这就是TStringList
类在你添加项目时内部为你做的事情。
如果向TStringList
对象添加项,则字符串列表会检查是否有足够的空间,如果没有,则会通过少量元素增加其内部数组的长度(通过这些元素可以消除所描述的内容)重新分配性能问题)。
但它并不像它听起来那么重要,如果你在非常长的数组上运行很长的字符串(数千个,可能是数十万个非常长的字符串元素),你会注意到性能问题。我不想仅仅因为这不是你在设置应用程序中需要的那些而在数字中具体,我认为。
总而言之,阵列存储速度更快,但您应该避免频繁调整大小。如果你真的非常关心性能,只需要分配它们的大小一次(如果你事先知道元素的数量),或者至少更少的元素(需要更多编码)。
TStringList
类失去了这个性能竞争(仅仅因为它是一个数组的包装器),但是当你逐个添加项目时它会非常有效地调整其内部存储的大小(不需要通过你自己一个阵列。)
根据经验,我建议您在事先知道元素数量或不经常更改长度时使用数组。字符串列表,当您无法实现,或者您需要一些内置的内容处理例程时。