TStringList vs String与TArrayOfString的数组

Bon*_*ngo 5 inno-setup tstringlist

我正在重构Inno Setup项目,对我来说不太清楚的是使用TArrayOfString,String和TStringList数组.这三种类型有什么不同?据我所知,它的使用似乎没有区别.所有三个存储字符串,我可以使用数组\列表获取存储的字符串,如下所示:arrayName[i].

当使用其中一个时,是一个更快还是被认为是错误的编码?我希望有人可以在这件事上给我带来清晰的认识.

TLa*_*ama 10

1.差异

TArrayOfString类型是别名array of string,因此它们等于(您可以see it here在源代码中).该TStringList班是索引字符串集合类,其存储是一组记录内部.但是字符串数组和TStringList类之间存在很大差异.

array of string仅仅是字符串元素的索引存储,而TStringList类是一个集合类提供的选择和方法的几个内容处理任务(例如像消除重复,排序,搜索等).

2.表现

如果我们忘记了TStringList类所提供的方法并将其视为存储,那么我们必须关注在我们想要比较性能时如何将字符串元素添加到应用程序中的存储中的方式.

通常,array只要不经常调整数组大小,类型就会更快,例如,在频繁调用时添加单个元素效率不高:

procedure AddSingleElement(var A: array of string; const S: string);
begin
  SetArrayLength(A, GetArrayLength(A) + 1);
  A[High(A)] := S;
end;
Run Code Online (Sandbox Code Playgroud)

那是因为重新分配了持有阵列的内存.这花费了一些时间.但是如果你不经常设置数组长度,你可以防止这个瓶颈.理想情况是,您只需将数组长度设置为目标长度一次(这需要事先知道元素计数).

改进上述代码的另一种选择(当你事先不知道元素的数量时)是通过几个元素预先分配数组长度.这将减少重新分配的数量,但也需要您记住并操作长度,这应该是逻辑的,实际的数组长度.这就是TStringList当您添加项目时,班级内部为您做的事情.

如果向TStringList对象添加项,则字符串列表会检查是否有足够的空间,如果没有,则会通过少量元素增加其内部数组的长度(这样可以消除所描述的重新分配性能问题).

但它并不像它听起来那么重要,如果你在非常长的字符串上操作非常长的字符串(数千个,可能是数十万个非常长的字符串元素),你会注意到性能问题.我不想在这里仅仅因为这不是你应该在设置应用程序中需要的那些数字,我想.

3.结论

总而言之,阵列存储速度更快,但您应该避免频繁调整大小.如果你真的非常关心性能,只需要分配它们的大小一次(如果你事先知道元素的数量),或者至少更少地分配更多的元素(这需要更多的编码).

TStringList班失去了这样的表现比赛(只是因为它是围绕一个数组的包装),但它非常有效地重新调整其内部存储,当你添加项目一个一个地(而不需要由您自己对数组编码如此).

经验法则

根据经验,我建议您在事先知道元素数量或不经常更改长度时使用数组.字符串列表,当您无法实现,或者您需要一些内置的内容处理例程时.