Có sự khác biệt về hiệu suất giữa String.Replace (char, char) và String.Replace (chuỗi, chuỗi) khi tôi chỉ cần thay thế một lần ký tự với một ký tự khác không?String.Replace (char, char) hoặc Replace (chuỗi, chuỗi)?
9
A
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 ở đó.
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
- 1. Chuỗi Unicode xóa char khỏi chuỗi
- 2. Lặp lại qua chuỗi char bằng char
- 3. Chuỗi JAVA đến char
- 4. Chuyển đổi chuỗi thành char
- 5. Biến mảng char thành chuỗi
- 6. chuỗi vào danh sách char
- 7. Remove '\' char từ chuỗi C#
- 8. Sự khác biệt giữa char a [] = "string"; char * p = "chuỗi";
- 9. Chấm dứt chuỗi - char c = 0 vs char c = '\ 0'
- 10. C# gán char và mảng char cho chuỗi?
- 11. char ** vs char * c [] để truy cập mảng chuỗi
- 12. làm thế nào để cắt mảng vector char hoặc chuỗi?
- 13. TinyXML: Lưu tài liệu vào char * hoặc chuỗi
- 14. Cách tối ưu để nhận chuỗi hoặc char * vào luồng?
- 15. Gán chuỗi ký tự cho char *
- 16. Ghép chuỗi ký tự bằng chữ char
- 17. const char * kiểu char *
- 18. Trả về char []/chuỗi từ hàm
- 19. sự khác biệt giữa char * và chuỗi
- 20. Tạo chuỗi không an toàn từ char []
- 21. PowerShell chuyển đổi Char Array thành chuỗi
- 22. .NET/C# - Chuyển đổi char [] thành chuỗi
- 23. Mảng Char vào chuỗi hex C++
- 24. So sánh chuỗi Iterator với Char Pointer
- 25. char * con trỏ từ chuỗi trong C#
- 26. loại chuỗi .NET so với mảng char
- 27. Char Mảng VS Char *
- 28. char! = (Ký char), char! = (Unsigned char)
- 29. Trong Java, làm thế nào để biến một chuỗi thành một char hoặc char thành một String?
- 30. string.Replace (hoặc sửa đổi chuỗi khác) không làm việc
cảm ơn chương trình thử nghiệm của bạn! – Laguna
+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