20120314

C# – 如何快速地更新文字方塊(TextBox)的內容

說明

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. 程式介面如下圖

201200313-1-如何快速地更新文字方塊(TextBox)的內容-W

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

201200313-2-如何快速地更新文字方塊(TextBox)的內容-W

 

 

結論

經過了十次的比較,我得出了以下的結論:

 

1. StringBuilder在一般添加文字較快,但在此處差異不大 (方法1和方法2約差0.2秒;方法3和方法4約差0.02秒)。

2. 直接將文字填入TextBox.Text的最後是最快的。(好像在說廢話)

3. 方法1和方法2因為是重新填入大量資料,所以TextBox閃爍得很厲害。

 

以上的結論和大家分享一下囉。

 

 

參考

Stopwatch 建構函式

无闪烁地快速附加字符串到TextBox控件

沒有留言: