Delphi StringBuilder

use*_*864 20 delphi

Delphi中存在类似Java或C#StringBuilder的东西吗?或者Delphi不需要StringBuilder并且s := s + 'some string';是良好的表达式(主要用于for,while循环).

ulr*_*chb 41

是的,Delphi提供TStringBuilder(自2009年起):

procedure TestStringBuilder;
var
  I: Integer;
  StringBuilder: TStringBuilder;
begin
  StringBuilder := TStringBuilder.Create;
  try
    for I := 1 to 10 do
    begin
      StringBuilder.Append('a string ');
      StringBuilder.Append(66); //add an integer
      StringBuilder.Append(sLineBreak); //add new line
    end;

    OutputWriteLine('Final string builder length: ' +
                    IntToStr(StringBuilder.Length));
  finally
    StringBuilder.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

是的,你是对的.s := s + 'text';并不比使用TStringBuilder慢.

  • StringBuilder实际上效率不高:http://www.delphitools.info/2013/10/30/efficient-string-building-in-delphi/ (5认同)

gab*_*abr 7

在较旧的Delphis中,您可以使用Hallvard Vassbotn的HVStringBuilder.我没能找到他的博客的来源,但你可以在获取它们OmniThreadLibrary源代码树,比如(你需要的文件HVStringBuilder.pas和HVStringData.pas).


ska*_*adt 5

Delphi不会“ 要求 ”一个字符串生成器类,但是如果您愿意使用它,可以为Delphi 2009提供一个。您的s:= s +'some string'示例这是一种典型的字符串填充方法,过去几十年来一直在Pascal / Delphi中使用,而没有任何重大问题。

  • mghie:有什么例子吗?据我所知,本机字符串生成器仅预分配比正常情况多一点的额外内存(由于堆分配粒度,普通字符串仅具有额外容量)。我想知道 tstringbuilder 是否更快,直到您的字符串长度超过数千个字符。我能找到关于这个主题的基准信息很少。 (2认同)

小智 5

提到的TStringBuilder就是可行方法。在您的具体情况下,串联可能没问题,但无论如何我总是会尝试替代方案。

我正在内存中创建一个 EPUB 正文内容 xhtml 文件(Delphi XE),但生成它花了很长时间,以至于我从来没有让它完成过(大约5 分钟多才放弃)。这是一个现实生活中的示例,包含大约 800,000 个字符的文本。采用完全相同的代码并直接用TStringBuilder.Append语句替换s:=s+''样式语句将其减少到大约3 秒。重申一下,除了不再使用串联之外,没有任何逻辑变化。

  • 有趣的是,我真的很想看到测试用例提供者。 (3认同)

小智 5

我真的很惊讶,没有人在任何评论或示例中提到您可以指示 TStringBuilder 在实例化期间预先分配适合任务的缓冲区。换句话说,如果您可以对可能需要多少内存进行简单的估计,稍微填充一下,并使用该值来实例化 TStringBuilder ,您就可以避免内存重新分配,从而减慢简单字符串连接的速度:

buff := TStringBuilder.Create( tmpEstimatedSize );
Run Code Online (Sandbox Code Playgroud)

我经常在新代码中使用 TStringBuilder 并优化旧代码,增量构建大型字符串时的 CPU 节省是巨大的。现在说实话,如果我只有少量字符串需要连接,我就不会使用 TStringBuilder。但是,如果我要序列化可能是大量数据的数据,那么 TStringBuilder 是显而易见的解决方案。