是否将变量赋值给控制值,然后使用较慢的变量然后直接使用控制值? (在.NET中)

时间:2011-12-29 01:38:07

标签: c# performance optimization variables

假设我们有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.06540​​00

分配时间开始时间: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字符串都相同,它们将引用内存中的相同位置。 所以至少我们不会对记忆造成打击。

1 个答案:

答案 0 :(得分:1)

我认为0.5%的性能损失(总共13.6秒中的0.0688秒)不值得通过删除变量来降低可读性和可维护性,甚至3.8MM它们:)。