可变范围和性能

Man*_*oor 1 c#

以下是我正在使用的代码

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

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

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

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

哇,这比预期的反应更多.大多数人都说"C#编译器可以解决这个问题".那么c编译器呢?

Ada*_*rth 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); 
}
Run Code Online (Sandbox Code Playgroud)

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

更新:鉴于从多个字符串创建字符串的快速性能,如果PerformSomeTask是您的瓶颈,尝试将字符串的迭代分解为多个线程 - 它不会提高代码的效率但是您将能够利用多个核心.