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

文章翻译 文章翻译
文章编号: 306822 - 查看本文应用于的产品
本文的发布号曾为 CHS306822
展开全部 | 关闭全部

本文内容

概要

本文演示使用 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”。

















属性

文章编号: 306822 - 最后修改: 2001年11月2日 - 修订: 1.0
这篇文章中的信息适用于:
  • Microsoft Visual C# .NET 2002 标准版
关键字:?
kbhowto kbhowtomaster KB306822
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com