2009-08-31 28 views
6

Nếu bạn đang phân tích cú pháp, chỉ cần nói HTML, khi bạn đọc tên phần tử, nó sẽ có lợi cho thực tập không? Logic ở đây là phân tích cú pháp này sẽ phân tích cú pháp các chuỗi giống nhau (tên phần tử) lặp đi lặp lại? Và một số tài liệu sẽ được phân tích cú pháp.Chuỗi nội mạng có giúp hiệu suất trong trình phân tích cú pháp không?

Theory:

// elemName is checked for null. 
MarkupNode node = new MarkupNode() 
{ 
    Name = String.IsInterned(elemName) ? elemName : String.Intern(elemName), 
    ... 
}; 

Câu hỏi này đã được thúc đẩy bởi các câu hỏi string-interning-memory.

+0

gợi ý chung của tôi với điều này sẽ là - thử nó cho mình và đo lường nếu nó làm cho bất kỳ sự khác biệt ... (Mặc dù tôi biết nó không phải là thực sự những gì bạn đang sau ...) – Rashack

+0

@Rashack tôi dự định để kiểm tra nó, nhưng tôi cũng nghĩ rằng đó là một câu hỏi hợp lệ và tôi không thấy một câu hỏi liên quan trực tiếp đến phân tích cú pháp văn bản, chẳng hạn như nội dung dựa trên HTML hoặc XML. :) –

Trả lời

2

Tôi thực sự không thể nói chính xác liệu điều này có giúp ích cho hiệu suất của bạn hay không. Nó sẽ phụ thuộc vào số lượng chuỗi bạn sử dụng và tần suất bạn tạo các phiên bản của các chuỗi đó. Interning thường được thực hiện tự động, do đó kiểm tra rõ ràng nếu chuỗi được thực tập có thể thực sự tăng chi phí của bạn và giảm hiệu suất của bạn. Khi nói đến việc sử dụng bộ nhớ, chuỗi nội bộ chắc chắn có thể sử dụng ít bộ nhớ hơn.

Nếu bạn muốn sử dụng chuỗi ký tự, có một số cách tốt hơn để đạt được nó. Đầu tiên và quan trọng nhất, tôi sẽ gắn các tên phần tử của bạn trong một lớp tĩnh với đầy đủ các hằng số chuỗi công khai. Bất kỳ chuỗi ký tự nào được tìm thấy trong mã nguồn chương trình của bạn chắc chắn và được tự động tập trung. Các chuỗi như vậy được tải vào hồ bơi thực tập khi ứng dụng của bạn được tải. Nếu chuỗi của bạn không thể được định nghĩa là hằng số cho việc chuẩn bị thực tập biên dịch, thì tôi chỉ cần gọi String.Intern (...) thay vì thực hiện biểu thức ternary đầy đủ String.IsInterned (...)? ...: String.Intern (...). Phương thức Intern sẽ tự động kiểm tra xem chuỗi có được interned hay không, trả về phiên bản interned nếu nó là, và nếu không sẽ thêm chuỗi vào pool intern và trả về nếu nó không được. Không cần phải tự kiểm tra IsInterned mình.

Một lần nữa, tôi không thể nói liệu chuỗi thực tập thủ công có cải thiện hiệu suất hay không. Nếu bạn sử dụng các hằng số, chúng sẽ được tự động interned cho bạn, theo cách tối ưu nhất, và đó là cách tiếp cận tốt nhất để cải thiện hiệu năng và sử dụng bộ nhớ của các chuỗi được sử dụng lại thường xuyên. Tôi thành thật khuyên bạn nên tránh xa việc thực hiện thủ công, và để cho trình biên dịch và xử lý thời gian chạy tối ưu hóa cho bạn.

1

Tất nhiên, các chuỗi nội trợ giúp thực hiện nhưng @jrista nói "Nếu bạn sử dụng hằng số, chúng sẽ tự động được lưu trữ cho bạn, ...".

Dưới đây là một số điều có thể giúp bạn,

Optimizing C# String Performance

TÓM TẮT: Chia sẻ bộ nhớ, C# duy trì một cái gì đó gọi là "bảng thực tập." Đây là danh sách các chuỗi hiện đang được tham chiếu. Nếu một chuỗi mới được tạo, thì bảng thực tập sẽ được chọn. Nếu chuỗi của bạn đã có trong đó, thì cả hai biến sẽ trỏ vào cùng một khối bộ nhớ được duy trì bởi bảng intern.

http://blog.cumps.be/string-concatenation-vs-memory-allocation/

Các vấn đề liên quan