Skip to content

善用 StringBuilder 的 buffer 改善程式效能

七月 27, 2008

在 C# 中,我們多半會利用 StringBuilder 來處理大量且繁雜的文字串邏輯,因為 StringBuilder 裡內建的 buffer 實在是太好用了,若能在程式裡共享 buffer 裡儲存的資料,那 StringWriter 便是今天的主角。

Dot Net Perls: http://dotnetperls.com/Content/StringWriter-Buffer.aspx

StringWriter 類別有實作了一個 StringBuilder,取得的方式是透過 GetStringBuilder(),它會回傳這個 StringBuilder 的 reference,於是我們就可以拿到這個免費的 buffer 來塞資料進去。

例如下面的範例,建了一個 MyTextWriter 來摸擬 HtmlTextWriter 類別中的幾個 method,然後在主程式裡去叫用這個 MyTextWriter 將資料塞入 buffer 裡。


class MyTextWriter : IDisposable
{
private string tagName;

private StringBuilder content;
public string Content
{
get { return content.ToString(); }
}

public MyTextWriter(StringWriter str_writer)
{
content = str_writer.GetStringBuilder();
}

public void RenderBeginTag(string tag_name)
{
tagName = tag_name;
content.Append("<").Append(tagName).Append(">");
}

public void MarkUp(string mark_str)
{
content.Append(mark_str);
}

public void RenderEndTag()
{
content.Append("</").Append(tagName).AppendLine(">");
}

public void Dispose()
{
content = null;
tagName = null;
}
}

class Program
{
public static string[] testStringList = { "One", "Two", "Three", "Four" };

public static string GetMarkup()
{
StringWriter strWriter = new StringWriter();
strWriter.WriteLine("here is the test");

using (MyTextWriter myWriter = new MyTextWriter(strWriter))
{
foreach (string item in testStringList)
{
myWriter.RenderBeginTag("span");
myWriter.MarkUp(item);
myWriter.RenderEndTag();
}
}
return strWriter.ToString();
}

static void Main(string[] args)
{
Console.WriteLine(GetMarkup());
Console.ReadLine();
}
}

這樣子的做法可以套用在不同的情境上,使得物件能善用 buffer 來存取資料,效能的改進當然也不在話下。

廣告
No comments yet

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: