你目前正处于脱机状态,正在等待 Internet 重新连接

HOW TO:在 Visual C# .NET 中改进字符串连接性能

本文的发布号曾为 CHS306822
本文讨论一种 Microsoft 产品的 Beta 版本。本文中的信息按“原样”提供,如有更改恕不另行通知。

对于该 Beta 产品,Microsoft 不提供正式的产品支持。有关获取 Beta 版支持的信息,请参见 Beta 产品文件中包括的文档资料,或查看您下载此版本的站点。 有关本文的 Microsoft Visual Basic .NET 版本,请参见 CHS306821

本任务的内容

概要
本文演示使用 StringBuilder 类与传统的连接技术相比有哪些好处。.NET 框架中的字符串是不变的(即,初始分配后的引用文本是只读的)。 对于习惯了 C/C++ 字符串操作技术的开发人员来说,它既提供了很多性能方面的好处,同时又带来了一些挑战。

返回页首

.NET 框架中的字符串描述

比 Visual C/C++ 中的 strcat() 更好的连接字符串的一项技术是,分配一个大字符数组作为缓冲区,并将字符串数据复制到缓冲区中。 在 .NET 框架中,字符串是不变的;不能就地对字符串进行修改。 C# + 连接运算符生成一个新的字符串,在连接大量文本时会造成性能下降。

但是,.NET 框架包含一个 StringBuilder 类,它已经专门为字符串连接进行了优化。 该类与 C/C++ 中使用的字符串数组有同样的好处,并且还能(根据需要)自动增大缓冲区大小并跟踪长度。本文中的示例应用程序演示了 StringBuilder 类的使用并将其性能与字符串连接技术进行比较。

返回页首

生成和运行演示应用程序

  1. 启动 Visual Studio .NET 并新建一个 Visual C# 控制台应用程序。
  2. 以下代码使用 += 连接运算符和 StringBuilder 类,分别对每次 30 个字符,共 5,000 次连接进行计时。 将此代码添加到 Main 过程中。
    const int sLen=30, Loops=5000;DateTime sTime, eTime;int i;string sSource = new String('X', sLen);string sDest = "";// // Time string concatenation.// sTime = DateTime.Now;for(i=0;i<Loops;i++) sDest += sSource;eTime = DateTime.Now;Console.WriteLine("Concatenation took " + (eTime - sTime).TotalSeconds + " seconds.");// // Time StringBuilder.// sTime = DateTime.Now;System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1));for(i=0;i<Loops;i++) sb.Append(sSource);sDest = sb.ToString();eTime = DateTime.Now;Console.WriteLine("String Builder took " + (eTime - sTime).TotalSeconds + " seconds.");// // Make the console window stay open// so that you can see the results when running from the IDE.// Console.WriteLine();Console.Write("Press Enter to finish ... ");Console.Read();
  3. 保存应用程序,按 F5 键编译并运行该应用程序。控制台窗口应输出类似下面的显示:
    Concatenation took 6.208928 seconds.String Builder took 0 seconds.Press ENTER to finish ...
  4. 按 ENTER 键停止运行应用程序并关闭控制台窗口。
返回页首

疑难解答

  • 如果您是在支持数据流式处理的环境(如 ASPX Web 窗体)中,或者您的应用程序能将数据写入磁盘,则请考虑避免字符串连接或 StringBuilder 的缓冲负担,而使用 Response.Write 方法或适合数据流的适当方法将数据直接写入数据流。
  • 请尽量再次使用现有的 StringBuilder 类,而不要在每次需要时都重新分配。这样可限制堆的增长并减少垃圾集合。 在这两种情况下,与使用 + 运算符相比,使用 StringBuilder 类可以更有效地使用堆。
返回页首

参考

StringBuilder 类还包含许多其他方法,可用于对使用中的字符串进行操作,这些方法未在本文中介绍。有关更多信息,请在联机帮助中搜索“StringBuilder”。

返回页首















属性

文章 ID:306822 - 上次审阅时间:11/02/2001 16:59:00 - 修订版本: 1.0

Microsoft Visual C# .NET 2002 标准版

  • kbhowto kbhowtomaster KB306822
反馈
=">