2012-02-03 37 views

Trả lời

9

Có, có: Tôi đã chạy thử nghiệm nhanh và có vẻ như phiên bản chuỗi chậm hơn khoảng 3 lần.

string a = "quickbrownfoxjumpsoverthelazydog"; 
    DateTime t1 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace('o', 'b'); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime t2 = DateTime.Now; 
    for (int i = 0; i != 10000000; i++) { 
     var b = a.Replace("o", "b"); 
     if (b.Length == 0) { 
      break; 
     } 
    } 
    DateTime te = DateTime.Now; 
    Console.WriteLine("{0} {1}", t2-t1, te-t2); 

1.466s vs 4.583s

Đây là không đáng ngạc nhiên, bởi vì tình trạng quá tải với chuỗi cần một vòng lặp thêm để đi qua tất cả các nhân vật của oldString. Vòng lặp này chạy chính xác một lần, nhưng chi phí vẫn ở đó.

+0

cảm ơn chương trình thử nghiệm của bạn! – Laguna

+1

+1 Không quan tâm, có ai có thể đảo ngược kỹ sư quá tải của System.String.ReplaceInternal không? Tôi quan tâm để xem nếu Dev quan sát bất biến về quá tải char :) – StuartLC

5

Tôi sẽ mong đợistring.Replace(char, char) để có khả năng nhanh hơn, vì nó có thể phân bổ chính xác lượng dung lượng phù hợp. Tôi nghi ngờ rằng nó sẽ tạo ra một sự khác biệt hiệu suất đáng kể trong nhiều ứng dụng thế giới thực mặc dù.

Quan trọng hơn, tôi muốn nói nó dễ đọc hơn - rõ ràng hơn là bạn thực sự sẽ kết thúc bằng một chuỗi có cùng độ dài.

3

String.Replace(char, char) nhanh hơn. Lý do rất đơn giản:

  • Char thay thế không cần phải phân bổ một chuỗi với một kích thước khác nhau, String thay thế cần phải tìm hiểu kích thước mới đầu tiên hoặc sử dụng một StringBuilder cho việc thay thế
  • Char thay thế không cần phải làm một kiểm tra với một phạm vi của một chuỗi. Hãy tưởng tượng bạn có một chuỗi như ABCACABCAC và bạn muốn thay thế ABC. Bạn cần phải tìm ra nếu 3 ký tự phù hợp, khi làm việc với ký tự, bạn chỉ cần tìm một char.
Các vấn đề liên quan