【问题标题】:Which string copying method is the faster in Delphi?Delphi 中哪种字符串复制方法更快?
【发布时间】:2022-11-16 06:13:33
【问题描述】:

我在 Delphi XE2 中工作,我必须制作一个复杂的函数,有时会复制较长的字符串部分,有时只会复制字符。这取决于源字符串的内容。所以问题是哪个示例方法更快?

Len := Length(Str);
SetLength(Result, Len);
for I := 1 to Len do Result[I] := Str[I];
Len := Length(Str);
SetLength(Result, Len);
Move(Str[1], Result[1], Len * SizeOf(Char));

我也很好奇运行时间的差异有多大。

【问题讨论】:

  • 我不确定我做对了。如果 Str 是源字符串并且您说“复制...字符串的一部分”,我希望开始和结束字符索引。您提供的两个示例很容易由您自己测试,您也可以与简单的分配进行比较:Result := Str,因为这就是您的示例所做的。会很有趣的您的结果。
  • @Tom Brunberg 这些只是例子。大多数时候我不必只复制整个字符串的一部分。这就是为什么我没有写“Result := Str;”
  • 那么,为什么您要编写示例代码来完成您通常不做的事情呢? :) 我建议您自己进行计时测试。如果结果出乎意料,那么您可以返回实际有意义的代码、示例数据和您的计时结果,以评估可能的原因以及如何改进。
  • @TomBrunberg 我问这个问题是因为我希望其他人对这些不同的方法有更多的了解(复制一系列单独的字符与使用 Move 过程),这样他们就可以给我建议应该使用哪种方法。
  • 不确定这是否有帮助,但有一个网站致力于寻找更快的 Delphi RTL 例程替代方案 (Delphi Fastcode)。它有点过时,但应该仍然有效。

标签: performance delphi


【解决方案1】:

Move 替代方案 - 即使 Move 被天真地编写为逐字节循环(它不在 RTL 中,尽管我们可能很快就会得到很大的优化空间(tm)) - 会更快,因为对于每个索引写入字符串时,编译器会插入对 System._UniqueStringU 的调用。

要将字符串的一部分(如果连续)复制到新字符串中,我可能会使用 System.CopySystem.SetString

但是,如果性能很重要,我的直觉告诉我这部分可能不值得优化,而是减少字符串使用并将它们的一部分复制为新字符串。在 .NET 中,这就是他们实现 Span<T> 的原因,它基本上是一个长度受限的指针。在处理诸如字符串解析之类的事情时,使用这种方法比优化复制本身更能提高您的性能。

【讨论】:

  • 谢谢!对我来说,Move 优于 System.Copy,因为我在操作开始时就知道字符串的最终长度。所以我可以使用 SetLength 为它分配空间,然后我可以将子字符串移入其中。如果我使用 System.Copy,每次调用都会导致新的空间分配。
猜你喜欢
  • 2013-06-05
  • 1970-01-01
  • 2016-04-17
  • 2020-06-01
  • 2021-11-15
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 2012-06-27
相关资源
最近更新 更多