写入GUI应该保持在最低限度吗?

时间:2014-04-15 08:57:41

标签: c#

我设置了一个带有文本框的窗体,还有两个按钮,这里是按钮的点击事件:

private int numberOfIterations = 1000;
private void WriteToGuiManyTimesButton_Click(object sender, EventArgs e)
{
    TestTextBox.Text = string.Empty;
    DateTime startTime = DateTime.Now;
    for (int i = 0; i < numberOfIterations; i++)
    {
        TestTextBox.Text += "s";
    }
    DateTime endTime = DateTime.Now;
    TestLabel.Text = (endTime.Ticks - startTime.Ticks).ToString();
}

private void WriteToGuiOnceButton_Click(object sender, EventArgs e)
{
    TestTextBox.Text = string.Empty;
    DateTime startTime = DateTime.Now;
    string s = "";
    for (int i = 0; i < numberOfIterations; i++)
    {
        s += "s";
    }
    TestTextBox.Text = s;
    DateTime endTime = DateTime.Now;
    TestLabel.Text = (endTime.Ticks - startTime.Ticks).ToString();
} 

最终结果是相同的,文本框有1000个“s”。

但是,如果您在内存中准备字符串,然后将其写入文本框,它只需要9985个刻度,但如果您每次都写入文本框,则需要1222285个刻度。

这是因为写入TextBox.Text所需的时间比写入内存中的变量要长,如果是这样,为什么?

2 个答案:

答案 0 :(得分:1)

多次写入Textbox.Text的原因要慢得多,因为它是一个属性。该属性在每次编写时都会执行代码,可能会触发各种事件,例如德米特里建议的重新绘制。

在内存中更改字符串只会创建一个带有添加字符的新字符串,这似乎要快得多。 Dmitry再次建议,使用StringBuilder将是最佳选择,因为这不会导致为每次修改创建新的字符串对象。

答案 1 :(得分:1)

TextBox需要花费大量时间才能在每个循环迭代中 重新绘制 ; 然而,string中常量s += "s" 重新创建 也不是一个好选择。 使用StringBuilder作为缓冲区:

private void WriteToGuiManyTimesButton_Click(object sender, EventArgs e) {
  DateTime startTime = DateTime.Now;

  StringBuilder Sb = new StringBuilder();

  for (int i = 0; i < numberOfIterations; ++i) {
    Sb.Append("s");
  }

  TestTextBox.Text = Sb.ToString();

  DateTime endTime = DateTime.Now;
  TestLabel.Text = (endTime.Ticks - startTime.Ticks).ToString();
}