可变范围和性能

时间:2010-07-02 08:53:17

标签: c#

以下是我正在使用的代码

private void TestFunction()
{
  foreach (MySampleClass c in dictSampleClass)
  {
    String sText = c.VAR1 + c.VAR2 + c.VAR3
    PerformSomeTask(sText,c.VAR4);
  }
}

我的朋友已经建议改为(以提高性能。 dictSampleClass 是一本字典。它有10K对象)

private void TestFunction()
{
  String sText="";
  foreach (MySampleClass c in dictSampleClass)
  {
    sText = c.VAR1 + c.VAR2 + c.VAR3
    PerformSomeTask(sText,c.VAR4);
  }
}

我的问题是,“上述变化会改善效果吗?如果是,怎么样?”

这比预期的反应还要多。大多数人都说“C#编译器可以解决这个问题”。那么c编译器呢?

5 个答案:

答案 0 :(得分:7)

编译器具有在需要时将变量声明移入/移出循环的智能。但是,在您的示例中,您使用的字符串是不可变的。通过在外面声明它我相信你正在尝试“创建一次,使用很多”,但是每次修改时都会创建字符串,因此你无法实现它。

不要听起来很糟糕,但由于字符串不变性,这是一个不成熟的优化,可能是一个失败的优化。

如果集合很大,请沿着将许多字符串附加到StringBuilder的路径 - 由分隔符分隔。然后在这个分隔符上拆分字符串并迭代数组以添加它们,而不是连接它们并在一个循环中添加它们。

StringBuilder sb = new StringBuilder();

foreach (MySampleClass c in dictSampleClass)
{
    sb.Append(c.VAR1);
    sb.Append(c.VAR2);
    sb.Append(c.VAR3);
    sb.Append("|");
}

string[] results = sb.ToString().Split('|');

for (int i = 0; i < dictSampleClass.Count; i++)
{
    string s = results[i];
    MySampleClass c = dictSampleClass[i];
    PerformSomeTask(s,c.VAR4); 
}

我推断使用此代码没有任何好处 - 很可能甚至不起作用!

UPDATE:鉴于来自多个字符串的字符串创建的快速性能,如果PerformSomeTask是您的瓶颈,请尝试将字符串的迭代分解为多个线程 - 这不会提高效率代码,但你将能够使用多个核心。

答案 1 :(得分:2)

通过反射器运行这两个函数,并查看生成的程序集。它可能会提供一些见解,但充其量,性能改进将是最小的。

答案 2 :(得分:1)

我会改为:

private void TestFunction() 
{ 
  foreach (MySampleClass c in dictSampleClass) 
  { 
    PerformSomeTask(c.VAR1 + c.VAR2 + c.VAR3, c.VAR4); 
  } 
} 

可能仍然没有真正的性能优势,但它会删除创建一个您并不真正需要的变量。

答案 3 :(得分:0)

不,它没有。像这样的东西是由C#编译器处理的,这是非常智能的,你基本上不需要关心这些细节。

使用促进可读性的代码。

您可以通过反汇编程序来检查。

答案 4 :(得分:0)

Ii不会提高性能。但另一方面说明:假设的改进容易出错。您必须测量您的应用程序,并且只在需要时才优化慢速部分。我不相信循环是你的appliacations的瓶颈。