改进C#连接字符串的性能

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

.NET 框架中的C#连接字符串描述

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

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

生成和运行演示应用程序

启动 Visual Studio .NET 并新建一个 Visual C# 控制台应用程序。
以下代码使用 += 连接运算符和 StringBuilder 类,分别对每次 30 个字符,共 5,000 次连接进行计时。 将此代码添加到 Main 过程中。

  1. const int sLen=30, Loops=5000;  
  2. DateTime sTime, eTime;  
  3. int i;  
  4. string sSource = new String('X', sLen);  
  5. string sDest = "";  
  6. //   
  7. // Time string concatenation.  
  8. //   
  9. sTime = DateTime.Now;  
  10. for(i=0;ieTime = DateTime.Now;  
  11. Console.WriteLine("Concatenation took " + (eTime - sTime).TotalSeconds + " seconds.");  
  12. //   
  13. // Time StringBuilder.  
  14. //   
  15. sTime = DateTime.Now;  
  16. System.Text.StringBuilder sb = new System.Text.StringBuilder((int)(sLen * Loops * 1.1));  
  17. for(i=0;isDest = sb.ToString();  
  18. eTime = DateTime.Now;  
  19. Console.WriteLine("String Builder took " + (eTime - sTime).TotalSeconds + " seconds.");  
  20. //   
  21. // Make the console window stay open  
  22. // so that you can see the results when running from the IDE.  
  23. //   
  24. Console.WriteLine();  
  25. Console.Write("Press Enter to finish ... ");  
  26. Console.Read(); 

保存应用程序,按 F5 键编译并运行该应用程序。控制台窗口应输出类似下面的显示:
Concatenation took 6.208928 seconds.
String Builder took 0 seconds.

Press ENTER to finish ...

按 ENTER 键停止运行应用程序并关闭控制台窗口。

C#连接字符串疑难解答

如果您是在支持数据流式处理的环境(如 ASPX Web 窗体)中,或者您的应用程序能将数据写入磁盘,则请考虑避免字符串连接或 StringBuilder 的缓冲负担,而使用 Response.Write 方法或适合数据流的适当方法将数据直接写入数据流。

请尽量再次使用现有的 StringBuilder 类,而不要在每次需要时都重新分配。这样可限制堆的增长并减少垃圾集合。 在这两种情况下,与使用 + 运算符相比,使用 StringBuilder 类可以更有效地使用堆。

【编辑推荐】

  1. 如何用C#和ADO.NET访问
  2. 浅析C# Switch语句
  3. C#验证输入方法详解
  4. 简单介绍C# 匿名方法
  5. C# FileSystemWatcher对象
责任编辑:彭凡 来源: 微软
相关推荐

2009-09-02 16:21:20

C#字符串

2009-08-07 14:02:12

C#数据库连接字符串

2009-08-20 17:55:43

C#连接Oracle数

2009-08-20 18:23:29

C#中SQL连接字符串

2009-08-07 14:15:21

C#字符串分割

2009-08-24 13:04:44

操作步骤C#字符串

2009-08-24 17:06:37

C#字符串

2009-08-06 16:01:09

C#字符串函数大全

2009-08-26 13:24:54

C#字符串

2009-08-07 14:22:56

C#字符串搜索

2009-08-07 14:34:33

C#模式字符串

2009-08-07 13:50:11

C#字符串

2009-08-07 14:46:59

C#匹配字符串

2009-08-20 17:30:02

C#连接字符串

2009-08-06 17:24:08

C#字符串

2009-08-07 15:49:46

使用C#字符串

2009-08-07 15:58:54

C#字符串插入html

2009-08-28 10:39:37

C#数值字符串

2009-09-02 13:41:57

C#字符串操作

2009-09-02 15:53:27

C#判断字符串应用
点赞
收藏

51CTO技术栈公众号