2010-03-19 24 views
8

Tôi đang cố gắng để ép hiệu suất như tôi có thể từ một HttpHandler tùy chỉnh phục vụ nội dung Xml.StringBuilder vs XmlTextWriter

Tôi tự hỏi điều gì tốt hơn cho hiệu suất. Sử dụng lớp XmlTextWriter hoặc các hoạt động đặc biệt của StringBuilder như:

StringBuilder sb = new StringBuilder("<?xml version="1.0" encoding="UTF-8" ?>");  
sb.AppendFormat("<element>{0}</element>", SOMEVALUE); 

Có ai có kinh nghiệm đầu tay không?

Trả lời

12

Như Josh đã nói, đây là một tối ưu hóa vi mô mà bạn thậm chí không nên cân nhắc nếu bạn chưa chứng minh sự cần thiết của nó. Nó cũng thực sự không khó để kiểm tra:

static void Main(string[] arguments) 
{ 
    const int iterations = 100000; 

    Stopwatch sw = new Stopwatch(); 
    sw.Start(); 
    string s = CreateUsingStringBuilder("content", iterations); 
    sw.Stop(); 
    Console.WriteLine(String.Format("CreateUsingStringBuilder: {0}", sw.ElapsedMilliseconds)); 

    sw.Reset(); 
    sw.Start(); 
    s = CreateUsingXmlWriter("content", iterations); 
    sw.Stop(); 
    Console.WriteLine(String.Format("CreateUsingXmlWriter: {0}", sw.ElapsedMilliseconds)); 

    Console.ReadKey(); 
} 

private static string CreateUsingStringBuilder(string content, int iterations) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < iterations; i++) 
     sb.AppendFormat("<element>{0}</element>", content); 

    return sb.ToString(); 
} 

private static string CreateUsingXmlWriter(string content, int iterations) 
{ 
    StringBuilder sb = new StringBuilder(); 
    using (StringWriter sw = new StringWriter(sb)) 
    using (XmlWriter xw = XmlWriter.Create(sw)) 
    { 
     xw.WriteStartElement("root"); 
     for (int i = 0; i < iterations; i++) 
      xw.WriteElementString("element", content); 
     xw.WriteEndElement(); 
    } 
    return sb.ToString(); 
} 

Không chỉ là phiên bản XmlWriter luôn nhanh hơn bằng cách một hoặc hai phần nghìn giây, nó tạo ra XML cũng như hình thành, trong đó phương pháp khác thì không. Tuy nhiên, cả hai phương pháp đều tạo ra các tài liệu XML có kích thước 100.000 phần trăm trong khoảng 60 mili giây trên máy tính xách tay hai tuổi của tôi, một khoảng thời gian giảm xuống không đáng kể so với thời gian cần thiết để đẩy nhiều dữ liệu qua mạng .

+0

Công việc tuyệt vời. Tôi thực sự đã làm điều này rất giống nhau trên máy tính của tôi và đã trở lại đây để đăng kết quả, nhưng bạn đánh tôi đến cú đấm. Kết quả của tôi về cơ bản giống như những gì bạn đã tìm thấy. +1 – Josh

+0

Tôi đồng ý rằng XmlWriter là tốt hơn, nhưng nếu chúng ta đang nói về tối ưu hóa, string.Format không phải là một cách để đi. sb.Append ("") .Gửi (nội dung) .Đăng ký (""); làm cho StringBuilder phiên bản nhanh hơn 2,5 lần rồi cái kia. –

1

Trung thực cho đến khi bạn thực sự, thực sự, thực sự, thực sự, thực sự cần phải quan tâm đến hiệu suất ... không.

Đi với giải pháp bền vững hơn trước và chỉ thỏa hiệp khi hiệu suất trở thành vấn đề có thể đo lường được. XmlTextWriter cung cấp cho bạn lợi ích của "Hiểu biết" về cách Xml được cho là hoạt động. StringBuilder không, và do đó dễ bị lỗi. Bạn không muốn dành một ngày theo dõi xuống một nút không đúng định dạng ở đâu đó trong mã xâu chuỗi gnarly của bạn.

Hãy để khung làm việc cho bạn.

+0

Một phần của xml phân phát một số tệp flash, vì vậy chúng tôi đã gửi cấu trúc nội dung ENTIRE cho khách hàng theo từng yêu cầu. Vì vậy, có, chúng tôi thực sự quan tâm đến hiệu suất. –

+0

Đây là tối ưu hóa vi mô mặc dù ... tỷ lệ phần trăm tổng thể của thời gian tính toán so với nói ... độ trễ mạng là bao nhiêu? Tôi sẵn sàng đặt cược rằng tất cả những nơi bạn có thể eek ra một số lợi ích hiệu suất, điều này sẽ giúp bạn thu được ít ROI nhất. Một lần nữa, bạn cần phải thực hiện một số đo lường thực tế và tối ưu hóa toàn bộ đường ống, không chỉ là một khía cạnh nhỏ bé của nó. – Josh

+0

Đúng, chúng tôi đang ở một điểm mà chúng tôi đang quyết định có nên viết các tệp xml vào đĩa và để cho bộ nhớ đệm máy khách/máy chủ tiếp quản hay không. Điều này sẽ hiệu quả nhất, nhưng trình bày một bộ vấn đề hoàn toàn mới cho chúng tôi, vì vậy hãy để điều đó cho một câu hỏi khác. –

2

Khi SOMEVALUE& hoặc < trong đó, cách tiếp cận này sẽ giúp bạn gặp rắc rối. Sử dụng các lớp nhận biết xml để tạo xml. Hãy đọc số HOWTO Avoid Being Called a Bozo When Producing XML.

+0

Cảm ơn thông tin phản hồi nhưng tôi nhận thức được các vấn đề liên quan đến cách tiếp cận StringBuilder.Chúng tôi có các lớp tiện ích để thoát khỏi các ký tự thích hợp như & và <>. Câu hỏi của tôi là cụ thể về hiệu suất. –

6

Tôi đồng ý rằng XmlWriter là tốt hơn cho khả năng bảo trì mã, nhưng nếu chúng ta đang nói về tối ưu hóa hiệu suất, bạn nên tránh cả XmlWriter và StringBuilder.AppendFormat, bởi vì bằng cách sử dụng một hiệu suất định dạng tàn tích.

thay đổi

sb.AppendFormat("<element>{0}</element>", content); 

để

sb.Append("<element>").Append(content).Append("</element>"); 

làm cho phiên bản StringBuilder 2,5 lần nhanh hơn sau đó người kia từ câu trả lời của Robert.