說明
TextBox是設計程式時常用到的元件,但是每次使用的時候,我都有些疑惑:
1. 設定TextBox.Text最快的方式為何?
2. 若要不斷更新大量文字,那是直接指定TextBox.Text的值會比較快?還是藉由StringBuilder儲存更新文字才套用至TextBox.Text比較快?
剛好最近比較閒,所以就寫了隻程式比較一下。
解決方法
首先一定要先加入「using System.Diagnostics」,因為將使用到其中的StopWatch類別,用以計算執行的時間。
測試的方式是重複將「-1-」(中間數字會遞增至1000),以TextBox顯示,並會捲動捲軸至最新的資料。
我想到了四種設定方式,來測試到底何種方式較快。
1. 將要更新的文字放入StringBuilder中,然後再套用至TextBox.Text。
1: textBox1.Text = string.Empty;
2: StringBuilder sb = new StringBuilder(100000);
3:
4: Stopwatch sw = new Stopwatch();
5: sw.Start();
6: for (int i = 0; i < 1000; i++)
7: {
8: sb.AppendLine("-" + i.ToString() + "-");
9: textBox1.Text = sb.ToString();
10: textBox1.SelectionStart = textBox1.Text.Length;
11: textBox1.ScrollToCaret();
12: }
13: sw.Stop();
14: MessageBox.Show(sw.ElapsedMilliseconds.ToString());
15:
2. 直接指定TextBox.Text的文字
1: textBox1.Text = string.Empty;
2:
3: Stopwatch sw = new Stopwatch();
4: sw.Start();
5: for (int i = 0; i < 1000; i++)
6: {
7: textBox1.Text += "-" + i.ToString() + "-" + Environment.NewLine;
8: textBox1.SelectionStart = textBox1.Text.Length;
9: textBox1.ScrollToCaret();
10: }
11: sw.Stop();
12: MessageBox.Show(sw.ElapsedMilliseconds.ToString());
13:
3. 直接將文字插入至TextBox.Text的最後面 (就方法論而言應該是最快的吧)
1: textBox1.Text = string.Empty;
2:
3: Stopwatch sw = new Stopwatch();
4: sw.Start();
5: for (int i = 0; i < 1000; i++)
6: {
7: textBox1.SelectionStart = textBox1.Text.Length;
8:
9: textBox1.SelectedText = "-" + i.ToString() + "-" + Environment.NewLine;
10: textBox1.ScrollToCaret();
11: }
12: sw.Stop();
13: MessageBox.Show(sw.ElapsedMilliseconds.ToString());
14:
4. 將要更新的文字放入StringBuilder中,然後再套用至TextBox.Text的最後面。(有點多此一舉)
1: textBox1.Text = string.Empty;
2: StringBuilder sb = new StringBuilder();
3:
4: Stopwatch sw = new Stopwatch();
5: sw.Start();
6: for (int i = 0; i < 1000; i++)
7: {
8: sb = new StringBuilder();
9: sb.Append("-" + i.ToString() + "-" + Environment.NewLine);
10: textBox1.SelectionStart = textBox1.Text.Length;
11: textBox1.SelectedText = sb.ToString();
12: textBox1.ScrollToCaret();
13: }
14: sw.Stop();
15: MessageBox.Show(sw.ElapsedMilliseconds.ToString());
16:
17:
18:
5. 程式介面如下圖

統計結果如下 (單位是微秒(ms),最後一行是平均值)

結論
經過了十次的比較,我得出了以下的結論:
1. StringBuilder在一般添加文字較快,但在此處差異不大 (方法1和方法2約差0.2秒;方法3和方法4約差0.02秒)。
2. 直接將文字填入TextBox.Text的最後是最快的。(好像在說廢話)
3. 方法1和方法2因為是重新填入大量資料,所以TextBox閃爍得很厲害。
以上的結論和大家分享一下囉。
參考
Stopwatch 建構函式
无闪烁地快速附加字符串到TextBox控件