这两种方法有什么不同?
它们中有一种更有效吗?
我在想,也许AppendText()使用了类似于StringBuilder的方法,即它使用自己的缓存而不是每次创建和追加一个新字符串,这是真的吗?
谢谢。
这两种方法有什么不同?
它们中有一种更有效吗?
我在想,也许AppendText()使用了类似于StringBuilder的方法,即它使用自己的缓存而不是每次创建和追加一个新字符串,这是真的吗?
谢谢。
根据 MSDN 文档的 “Remarks” 部分中明确提到的内容,AppendText 方法使用户能够在不使用文本连接的情况下向文本控件的内容追加文本,这可以在需要许多连接时获得更好的性能。
你的问题是:
这两种方法有什么区别?
我们都知道如何使用 TextBox.Text += something;
即创建并每次追加一个新字符串,但我无法找到任何代码片段来了解 AppendText
的工作原理,即它是否内部使用 StringBuilder
或其他内容。
哪种方法更有效?
我认为上面的问题的答案将取决于具体情况,(基于测试案例观察)
如果
Multiline
属性设置为false
,则连接 (+=)效果更好,但另一方面Multiline
属性设置为true
,则AppendText
的性能要好得多。
编辑 根据来自 Rawling 的评论,我在自定义的 Win-form 解决方案中,使用一个简单的 textbox
,使用简单的 for-loop
将一个简单的字符串 hello
追加了10000次。
private void btnAppendText_Click(object sender, EventArgs e)
{
txtText.Text = string.Empty;
DateTime startTime = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
txtText.AppendText(s);
}
DateTime endTime = DateTime.Now;
txtTime.Text = (endTime.Ticks - startTime.Ticks).ToString();
}
private void btnConcante_Click(object sender, EventArgs e)
{
txtText.Text = string.Empty;
DateTime startTime = DateTime.Now;
for (int i = 0; i < 5000; i++)
{
txtText.Text += s;
}
DateTime endTime = DateTime.Now;
txtTime.Text = (endTime.Ticks - startTime.Ticks).ToString();
}
输出非常令人惊讶,
测试1:多行属性为true
我不得不将迭代次数减半,即5000次文本连接,因为它太耗时间了。
btnAppendText_Click
在txtTime
上的输出是37222129
,10000次迭代需要近3-4秒钟
btnConcante_Click
在txtTime
上的输出是14449906487
,仅进行5000次迭代就需要超过25分钟。
从上面的结果可以清楚地看出,当 Multiline
为 true
时,AppendText
比 Concatenation
更快更有效。
测试2:多行属性为false
btnConcante_Click
在txtTime
上的输出是39862280
,10000次迭代需要近3-4秒钟
btnAppendText_Click
在txtTime
上的输出是1043279672
,10000次迭代需要近2-3分钟
从上面的结果可以清楚地看出,当 Multiline
为 false
时,Concatenation
比 AppendText
更快更有效。
AppendText
并不比连接更有效率。我进行了性能测试,.Text +=
比 .AppendText
快几个数量级。 - Rawling+=
循环仍然在3秒内完成,而我的AppendText
运行大约2分钟。我猜MSDN文档并不是完全垃圾 - 它正确地说它可以产生更好的性能,因为您已经见证了它!- 但我很想知道为什么我们看到如此相反的结果。与所有性能问题一样,这取决于OP对其真实世界使用情况进行分析! - RawlingAppendText与StringBuilder无关。实际上,Text方法似乎更简单(可能更高效)。参考这两种方法的源代码:
public void AppendText(string text)
{
if (text.Length > 0)
{
int start;
int length;
this.GetSelectionStartAndLength(out start, out length);
try
{
int endPosition = this.GetEndPosition();
this.SelectInternal(endPosition, endPosition, endPosition);
this.SelectedText = text;
}
finally
{
if (base.Width == 0 || base.Height == 0)
{
this.Select(start, length);
}
}
}
}
public override string Text {
get {
return base.Text;
}
set {
if (value != base.Text) {
base.Text = value;
if (base.IsHandleCreated) {
base.SendMessage(185, 0, 0);
}
}
}
}
KeyDown
处理程序,当你按下 Control 键时调用 AppendText
,但它仍然会清除你所做的任何选择。 - Rawlingdbw
的补充(以及万一有人能找到我犯错的地方),这是我的性能测试:private void Form1_Click(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Reset();
textBox1.Text = "";
sw.Start();
for (int i = 0; i < 10000; i++)
{
textBox1.Text += s;
}
sw.Stop();
var e1 = sw.Elapsed;
sw.Reset();
textBox1.Text = "";
sw.Start();
for (int i = 0; i < 10000; i++)
{
textBox1.AppendText(s);
}
sw.Stop();
var e2 = sw.Elapsed;
}
我看到e1
大约需要3秒钟,而e2
则需要大约2分钟。
1000
,因为它需要更多时间。在调试时,输出结果为 TotalSeconds = 16.334709399999998
,而使用 AppendText
进行 10000
次迭代后,TotalSeconds = 3.7410611
。 - Deepak BhatiaMultiline
结果是相反的!微软在某个地方记录这些信息是很好的... - RawlingMultiline
为 false 时,我得到了相反的结果。 - Deepak Bhatia