我设置了一个带有文本框的窗体,还有两个按钮,这里是按钮的点击事件:
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所需的时间比写入内存中的变量要长,如果是这样,为什么?
答案 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();
}