Lập trình C#

Nối chuỗi trong C# thế nào cho hiệu quả?

Nối chuỗi trong C# thế nào cho hiệu quả?
Được viết bởi Minh Hoàng

Series lập trình C#, ngôn ngữ lập trình hiện đại và mạnh mẽ.

Chuỗi (string) trong C# là một kiểu dữ liệu có sẵn như các kiểu int, long…, có đầy đủ tính chất mềm dẻo, mạnh mẽ và dễ dùng. Một đối tượng chuỗi trong C# là một hay nhiều ký tự unicode không thể thay đổi thứ tự. Nói cách khác là các phương thức áp dụng lên chuỗi không làm thay đổi bản thân chuỗi, chúng chỉ tạo một bản sao có sửa đổi, chuỗi gốc vẫn giữ nguyên.

– Trong C#, bạn có thể sử dụng các chuỗi (string) như là mảng các ký tự. Tuy nhiên, phổ biến hơn là để sử dụng từ khóa string để khai báo một biến chuỗi. Từ khóa string là một alias cho lớp System.String trong C#.

– Việc nối chuỗi trong C# là rất phổ biến, được sử dụng nhiều khi lập trình, và trong C# cũng hỗ trợ nhiều cách nối chuỗi như sau, tuy nhiên cách nối chuỗi nào là hiệu quả nhất thì chúng ta sẽ cùng thảo luận trong bài viết này.

  • Sử dụng StringBuilder
  • Sử dụng toán tử dấu + (+演算子, simple concatenation)
  • Sử dụng string.Format()
  • Sử dụng string.Concat()
  • Sử dụng string.Replace()

– Để có thể tính toán được thời gian thực thi của mỗi cách nối chuỗi trên, mình sẽ viết một đoạn code demo như sau:

using System;
using System.Text;

namespace MinhHoangBlog
{
	class Program
	{
		static void Main(string[] args)
		{
			var len = 10000000;
			var sw = new System.Diagnostics.Stopwatch();

			// StringBuilder
			sw.Start();
			for (int ii = 0; ii < len; ii++)
			{
				StringBuilder sb = new StringBuilder();
				sb.Append("%").Append(ii).Append("%");
				var s = sb.ToString();
			}
			sw.Stop();
			Console.WriteLine(sw.Elapsed.ToString());

			// Simple Concatenation +
			sw.Restart();
			for (int ii = 0; ii < len; ii++)
			{
				var s = "%" + ii + "%";
			}
			sw.Stop();
			Console.WriteLine(sw.Elapsed.ToString());

			// string.Format
			sw.Restart();
			for (int ii = 0; ii < len; ii++)
			{
				var s = string.Format("%{0}%", ii);
			}
			sw.Stop();
			Console.WriteLine(sw.Elapsed.ToString());

			// string.Concat
			sw.Restart();
			for (int ii = 0; ii < len; ii++)
			{
				var s = string.Concat("%", ii, "%");
			}
			sw.Stop();
			Console.WriteLine(sw.Elapsed.ToString());

			// string.Replace
			sw.Restart();
			for (int ii = 0; ii < len; ii++)
			{
				var s = "{s1}{s2}{s3}";
				s = s.Replace("{s1}", "%").Replace("{s2}", ii.ToString()).Replace("{s3}", "%");
			}
			sw.Stop();
			Console.WriteLine(sw.Elapsed.ToString());
		}
	}
}

– Sau khi thực hiện chạy 5 lần và tính thời gian thực thi trung bình của mỗi cách, chúng ta có kết quả như sau:

Phương pháp Thời gian thực thi
StringBuilder 00:00:02.3464193 ③
Toán tử dấu + 00:00:02.0393685 ②
string.Format 00:00:02.5324847 ④
string.Concat 00:00:01.8001354 ①
string.Replace 00:00:04.1992046 ⑤

– Từ kết quả trên chúng ta thấy rằng, string.Concat() cho tốc độ nối chuỗi nhanh nhất và nên tránh nối chuỗi bằng string.Replace() (vì cơ bản thì string.Replace() sinh ra không phải mục đích để nối chuỗi), 3 phương pháp còn lại thì cho tốc độ khác nhau không nhiều. Do đó, tùy thuộc vào mục đích của bạn mà chọn phương pháp thích hợp để sử dụng.

* Concatenate (+) is best at concatenating. 
* StringBuilder is best when you need to building.
* string.Format is best at formatting.

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »