【问题标题】:Is there something faster than StringBuilder for "parameterized" string building?对于“参数化”字符串构建,是否有比 StringBuilder 更快的方法?
【发布时间】:2012-07-12 08:54:09
【问题描述】:

我有一个用 T4 制作的自定义小“视图”引擎。基本上,它所做的就是使用带有特殊指令的“静态”HTML 文件并输出如下内容:

StringBuilder output... 
output.Append("<html> my code blah");
if(MyParameter!=null){
  output.Append(MyParameter.ToString);
}
output.append("more code");
return output.ToString();

当然,还有更多内容,但这就是要点。它接受一个 HTML 文件并生成一个普通的旧 C# 类。

我真的很喜欢这种方式,因为我可以拥有静态类型的视图。不幸的是,这似乎有点慢。我的问题尤其是我有一个index 视图,其中多个视图包含blog entry 视图,所以基本上相同的基本字符串最终会构建,只是根据提供的参数在这里和那里有一些不同的文本。

无论如何,我想知道是否有任何方法可以加快这个过程。真的有什么比 StringBuilder 更快的吗?

另外,不要担心“不干净”的代码。因为我使用 T4 来生成这些视图类,所以我可以编写一些非常 hack-ish 的代码,这并不重要,因为我基本上只编写一次。

【问题讨论】:

  • 这很模糊,不是吗?至少要收集一些证据,证明实际上是建造者的速度很慢。 .NET GC 性能计数器告诉您什么?分析器告诉你什么?没有什么比 StringBuilder 更快的了,使用它的容量属性在 .NET 4 上没有太大的区别。还有一些你没有提到的东西。
  • 据我所知,StringBuilder 是高效构建字符串的推荐方式。也许您可以使用流将文本直接发送到目的地,而不是将其构建为字符串?也许它的 T4 速度很慢。

标签: .net string performance t4 stringbuilder


【解决方案1】:

对于字符串生成器

  • 重用 StringBuilder 对象,而不是每次都创建一个新对象
  • 将 StringBuilder 的容量设置为最终字符串的最大大小。

替代品

  • 创建所有可能字符串的列表,然后根据参数值从它们中进行选择(如果没有太多可能的排列)

还有

  • 对您的代码进行基准测试,因为构建字符串不太可能阻碍您。我可以在单核上构建 30 万串/秒。

【讨论】:

  • +1 用于重用 StringBuilder 对象。我在我的自定义 JSON 解析器中对其进行了分析,new StringBuilder 恰好发生在“热路径”上。在我将其重新排列为 StringBuilder 和 sb.Clear() 的全局实例后,我的解析器速度提高了 3 倍。
【解决方案2】:

请指定创建的 StringBuilder 的容量。这将避免多次内存分配。示例:

var a = new StringBuilder(3000);

其中,3000 是最终字符串的估计大小

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 2022-01-20
    • 1970-01-01
    • 2018-06-18
    • 2014-01-07
    相关资源
    最近更新 更多