01/10/2018, 17:35

So sánh String và StringBuilder

String và StringBuilder chắc hẳn rất quen thuộc với chúng ta. Nhưng có khi nào chúng ta thắc mắc tại sao có song song String và StringBuilder? Mục đích thực sự của nó như thế nào? Dùng String tốt hay StringBuilder tốt hơn? … Hãy cùng Góc Kinh Nghiệm tìm hiểu và so sánh chúng, để chúng ta ...

String và StringBuilder chắc hẳn rất quen thuộc với chúng ta. Nhưng có khi nào chúng ta thắc mắc tại sao có song song String và StringBuilder? Mục đích thực sự của nó như thế nào? Dùng String tốt hay StringBuilder tốt hơn? … Hãy cùng Góc Kinh Nghiệm tìm hiểu và so sánh chúng, để chúng ta biết chính xác là dùng String hay StringBuilder hiệu quả tùy vào mục đích cụ thể của đoạn code.

Như các bạn biết string là một kiểu dữ liệu immutable (là kiểu dữ liệu bất biến/không thay đổi). Khi một instance của string được tạo ra, chúng ta không thay đổi nó được. Mỗi khi thay đổi string thì một instance mới được tạo ra chứ không phải là instance củ được cập nhật. Nếu khái niệm instance bạn chưa quen thì ví dụ bên dưới sẽ làm bạn dễ hiểu hơn.

Ví dụ 1:

string a, b = "Hello ", c = "Lovely ", d = "World!";
a = a + b;
a = a + c;
a = a + d;
// a = "Hello Lovely World!"

Giải thích: từ ví dụ 1 bên trên, a là một instance của string. Và a được thay đổi nhiều lần, lúc đó trên bộ nhớ thực chất là nhiều instance được tạo ra chứ không phải một instance vì a là kiểu dữ liệu immutable. Mỗi lần dùng một toán tử cộng chuỗi (+) ở mỗi dòng code. Thì một StringBuilder tương ứng được tự động tạo ra, rồi sau khi cộng chuỗi StringBuilder được tự động dispose. Việc này ảnh hưởng đến performance vì StringBuilder được tạo rồi hủy liên tục ứng với mỗi dòng code.

Để giải quyết nhiều instance được tạo ra khi cố thay đổi a. StringBuilder hỗ trợ một Append, Replace, Insert, Remove để không tạo ra nhiều instance mới. Chỉ có một instance được tạo ra và tăng performance.

Ví dụ 2:

StringBuilder sb = new StringBuilder("");
sb.Append("Hello ");
sb.Append("Lovely");
sb.Append("World!");
string a = sb.ToString();
// a = "Hello Lovely World"

Giải thích: ví dụ 2 thì chỉ có một StringBuilder được tạo ra, sau đó giá trị của nó được thay đổi nên performce sẽ nhanh hơn ví dụ 1 ở trên.

Vậy nên dùng String hay StringBuilder? Câu trả lời là tùy ngữ cảnh của đoạn code của bạn mà nên dùng String hay StringBuilder. Bên dưới là sẽ 2 ví dụ cụ thể về performance.

Ví dụ 3: trường hợp String và StringBuilder có performance như nhau

string b = "Hello ", c = "Lovely ", d = "World!";
string a = b + c + d;

Giải thích: trong ví dụ 3 bạn sử dụng String hay StringBuilder là như nhau vì instance a chỉ được tạo ra một lần.

Ví dụ 4: StringBuilder có perforamance nhanh hơn String khi sử dụng vòng lặp for, while …

string a = "";
for (int i = 0; i < 1000; i++)
{ a = a + i.toString(); }

Giải thích: trong ví dụ 4 ở trên vì vòng lặp for chạy 1000 lần. Sẽ có 2001 instance (2*n + 1) của a được tạo ra, chứ không phải là 1 hay 1000 instance. Trường hợp này dùng StringBuilder thì tốt hơn, nếu dùng StringBuilder thì chỉ có một instance được tạo ra.

Giờ thì bạn có thể hình dung được sự khác nhau của String và StringBuilder rồi đúng không. Không phải lúc nào StringBuilder cũng là tốt nhất. Nhưng hiểu rõ chúng để quyết định xem dùng khi nào là thích hợp, giúp tăng performance của code là rất cần thiết.

Góc Kinh Nghiệm chúc các bạn thành công!


0