Trong .NET, Substring
là O (n) chứ không phải là O (1) của Java. Điều này là bởi vì trong .NET, đối tượng String chứa tất cả dữ liệu ký tự thực tế chính nó - do đó, lấy một chuỗi con liên quan đến việc sao chép tất cả dữ liệu trong chuỗi con mới. Trong Java, substring
chỉ có thể tạo một đối tượng mới đề cập đến mảng char ban đầu, với chỉ số bắt đầu và độ dài khác nhau.
Có ưu và nhược điểm của từng phương pháp:
- cách tiếp cận NET của có bộ nhớ cache sự liên lạc tốt hơn, tạo ra ít đối tượng , và tránh các tình huống mà một chuỗi con nhỏ ngăn cản rất lớn
char[]
là thu gom rác thải . Tôi tin rằng trong một số trường hợp nó có thể làm cho interop rất dễ dàng quá, nội bộ.
- cách tiếp cận của Java làm cho tham gia một chuỗi rất hiệu quả, và có lẽ một số các hoạt động khác quá
Có một ít chi tiết hơn trong strings article tôi. Đối với câu hỏi chung về tránh các cạm bẫy hiệu suất, tôi nghĩ rằng tôi nên có câu trả lời soạn sẵn sàng để cắt và dán: đảm bảo kiến trúc của bạn hiệu quả và triển khai theo cách dễ đọc nhất có thể. Đo lường hiệu suất và tối ưu hóa nơi bạn tìm thấy tắc nghẽn.
Ngẫu nhiên, điều này làm cho string
rất đặc biệt - đó là chỉ loại không cho mảng có bộ nhớ thay đổi theo thẩm trong thời hạn CLR cùng.
Đối với các chuỗi nhỏ, đây là một chiến thắng lớn. Thật tệ khi có tất cả các chi phí của một đối tượng, nhưng khi có thêm một mảng liên quan, một chuỗi ký tự đơn có thể mất khoảng 36 byte trong Java. (Đó là số "ngón tay trong không trung" - Tôi không thể nhớ chi phí chính xác của đối tượng. Nó cũng sẽ phụ thuộc vào VM bạn đang sử dụng.)
Nguồn
2010-08-13 07:16:18
Tại sao không chạy điểm chuẩn vi mô của riêng bạn để kiểm tra ? Bạn có thể liên kết đến các nguồn có nội dung có hiệu suất "xấu" không? – Oded
@Oded: nguồn là nhận xét của Danny Chen tại đây http://stackoverflow.com/questions/3474254/how-to-make-a-first-letter-capital-in-c/3474263#3474263; thành thật mà nói tôi sẽ ngạc nhiên nếu 'Substring' không phải là' O (1) 'hoạt động thời gian và không gian (như Java), nhưng tôi cho anh ta lợi ích của sự nghi ngờ vì tôi không biết .NET. – polygenelubricants
"hiệu suất kém" nghĩa là gì? So với cái gì? .NET cũng có hiệu suất kém nếu so sánh với C++ chẳng hạn. Chúng ta có nên thả .NET vì điều đó không? –