假设我们有3,800,000个文本框。 每个文本框都包含一些单词。
我们有一个函数GenerateIRSTaxCode(string s, string s2, ... string s3800000)
我们有一个按钮,它将采用这些3.8MM的texbox并将它们传递给GenerateIRSTaxCode()
函数。
通过以下方式实现性能差异:
string s = textbox1.text;
string s1 = textbox2.text;
...
string s3800000= textbox3800000.text;
GenerateIRSTaxCode(s1, s2, ... s3800000)
VS
GenerateIRSTaxCode(textbox1.text, textbox2.text, ... textbox3800000.text)
编辑:
所以我做了一些测试:
{
for (int j = 0; j < 5; j++)
{
DateTime starttime1 = DateTime.Now;
List<string> words = new List<string>();
for (int i = 0; i < 4000000; i++)
{
string s = textBox2.Text;
words.Add(s);
}
DateTime endtime1 = DateTime.Now;
DateTime starttime2 = DateTime.Now;
for (int i2 = 0; i2 < 4000000; i2++)
{
words.Add(textBox2.Text);
}
DateTime endtime2 = DateTime.Now;
TimeSpan elapsed1 = endtime1 - starttime1;
TimeSpan elapsed2 = endtime2 - starttime2;
TimeSpan performancehit = elapsed1 - elapsed2;
textBox1.AppendText("Assign Time start: " + starttime1 + "\r\nAssign Time End: " + endtime1 + "\r\n elapsed time: " + elapsed1.ToString() +
"\r\n NoAssign Time start: " + starttime2 + "\r\nNoAssign Time End: " + endtime2 + "\r\n elapsed time: " + elapsed2.ToString() +"\r\n Performance Hit: " + performancehit.ToString());
}
textBox1.AppendText("Performance Complete");
}
我的结果:
分配时间开始时间:12/28/2011 9:39:19分配时间结束时间:12/28/2011 9:39:32 PM已用时间:00:00:13.6545000 NoAssign时间开始时间:12/28/2011 9:39:32 PM NoAssign Time结束时间:12/28/2011 9:39:46 PM经过时间:00:00:13.6080000
表演命中:00:00:00.0465000
分配时间开始:12/28/2011 9:39:46 PM分配时间结束:12/28/2011 9:40:00 PM经过时间:00:00:13.7054000 NoAssign时间开始:12/28/2011 9:40:00 PM NoAssign Time结束时间:12/28/2011 9:40:13 PM经过时间:00:00:13.6400000 表演命中:00:00:00.0654000
分配时间开始时间:12/28/2011 9:40:13 PM分配时间结束时间:12/28/2011 9:40:27 PM已用时间:00:00:13.6434000 NoAssign时间开始时间:12/28/2011 9:40:27 PM NoAssign Time结束时间:12/28/2011 9:40:41 PM经过时间:00:00:13.7122000
表现命中:
-00:00:00.0688000
分配时间开始时间:12/28/2011 9:40:41 PM分配时间结束时间:12/28/2011 9:40:54 PM已用时间:00:00:13.6544000 NoAssign时间开始时间:12/28/2011 9:40:54 PM NoAssign Time结束时间:12/28/2011 9:41:08 PM经过时间:00:00:13.6342000 表演命中:00:00:00.0202000
分配时间开始时间:12/28/2011 9:41:08 PM分配时间结束时间:12/28/2011 9:41:22 PM已用时间:00:00:13.6788000 NoAssign时间开始时间:12/28/2011 9:41:22 PM NoAssign Time结束时间:12/28/2011 9:41:35 PM已用时间:00:00:13.6754000
表演命中:00:00:00.0034000
表现完成
所以看起来有一个打击。但是在第3轮比赛中 - 其他方式更快。 也许在我的电脑上运行的其他东西可能影响了这个?
EDIT2
进一步挖掘这个问题。查理卡尔弗特在这里找到了一篇非常好的文章:
http://blogs.msdn.com/b/charlie/archive/2006/10/11/optimizing-c_2300_-string-performance.aspx
这与
这一事实有关C#维护一个叫做“实习生表”的东西。这是一个列表 当前引用的字符串。如果使用创建新字符串 代码如第18行和第19行所示,然后是实习生表 检查。如果你的字符串已经在那里,那么两个变量都会 指向由实习生表维护的同一块内存。该 字符串不重复。
我会认为假设文本框数据存储为字符串,并且我的s1和textbox1.text字符串都相同,它们将引用内存中的相同位置。 所以至少我们不会对记忆造成打击。
答案 0 :(得分:1)
我认为0.5%的性能损失(总共13.6秒中的0.0688秒)不值得通过删除变量来降低可读性和可维护性,甚至3.8MM它们:)。