Tôi đang tối ưu hóa một đối tượng tùy chỉnh -> tiện ích tuần tự hóa XML, và tất cả đều được thực hiện và hoạt động và đó không phải là vấn đề.Quyết định khi nào nên sử dụng XmlDocument vs XmlReader
Nó hoạt động bằng cách tải tệp vào đối tượng XmlDocument
, sau đó đệ quy đi qua tất cả các nút con.
Tôi thấy rằng có lẽ sử dụng XmlReader
thay vì có XmlDocument
tải/phân tích toàn bộ nội dung sẽ nhanh hơn, vì vậy tôi cũng đã triển khai phiên bản đó.
Các thuật toán hoàn toàn giống nhau, tôi sử dụng lớp trình bao bọc để trừu tượng hóa chức năng xử lý một số XmlNode
và số XmlReader
. Ví dụ: lợi nhuận của phương thức GetChildren
trả về con là XmlNode
hoặc SubTree XmlReader
.
Vì vậy, tôi đã viết một trình điều khiển thử nghiệm để kiểm tra cả hai phiên bản và sử dụng bộ dữ liệu không tầm thường (tệp XML 900kb với khoảng 1.350 phần tử).
Tuy nhiên, khi sử dụng JetBrains dotTRACE, tôi thấy phiên bản XmlReader
thực sự chậm hơn phiên bản XmlDocument
! Dường như có một số xử lý quan trọng liên quan đến các cuộc gọi đã đọc XmlReader
khi tôi đang lặp qua các nút con.
Vì vậy, tôi nói tất cả những gì để hỏi này:
gì được những ưu điểm/nhược điểm của XmlDocument
và XmlReader
, và trong hoàn cảnh nào nên bạn sử dụng một trong hai?
Tôi đoán là có ngưỡng kích thước tệp tại đó XmlReader
trở nên tiết kiệm hơn về hiệu suất, cũng như ít tốn nhiều bộ nhớ hơn. Tuy nhiên, ngưỡng đó dường như vượt quá 1MB.
Tôi gọi ReadSubTree
mỗi thời gian để xử lý các nút con:
public override IEnumerable<IXmlSourceProvider> GetChildren()
{
XmlReader xr = myXmlSource.ReadSubtree();
// skip past the current element
xr.Read();
while (xr.Read())
{
if (xr.NodeType != XmlNodeType.Element) continue;
yield return new XmlReaderXmlSourceProvider (xr);
}
}
thử nghiệm đó áp dụng cho rất nhiều đối tượng ở mức duy nhất (tức là rộng & cạn) - nhưng tôi tự hỏi như thế nào XmlReader
giá vé khi XML sâu & rộng? I E. XML tôi đang xử lý giống như mô hình đối tượng dữ liệu, 1 đối tượng cha mẹ với nhiều đối tượng con, v.v. 1..M..M..M
Tôi cũng không biết cấu trúc của XML tôi đang phân tích cú pháp, vì vậy tôi có thể không tối ưu hóa cho nó.
Tôi luôn tự hỏi tại sao có cả XmlDocument và XmlReader ... –
Thực tế có một tùy chọn khác cho XMLDocument và XMLReader. Bây giờ bạn có thể sử dụng LINQ to XML nhưng thực ra XMLReader hiệu quả hơn theo nhiều cách. – Tarik
Chờ. Phương thức 'GetChildren' của bạn trả về một' XmlReader'? Bạn có nghĩa là, bạn đang gọi 'XmlReader.Create()' mỗi khi bạn xử lý một nút con? –