代码之家  ›  专栏  ›  技术社区  ›  Manjoor

可变范围和性能

c#
  •  1
  • Manjoor  · 技术社区  · 16 年前

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

    我的朋友建议改为(提高成绩)。 dictSampleClass类

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

    我的问题是,“上述改变是否会提高绩效?如果是,怎么做?”

    5 回复  |  直到 16 年前
        1
  •  7
  •   Adam Houldsworth    16 年前

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

    如果集合很大,请继续将许多字符串附加到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); 
    }
    

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

        2
  •  2
  •   cristobalito    16 年前

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

        3
  •  1
  •   cjk    16 年前

    我会选择这个:

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

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

        4
  •  0
  •   user381879    16 年前

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

    总是使用提高可读性的代码。

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

        5
  •  0
  •   aggsol    16 年前

    我不会提高绩效。但另一方面:假设的改进容易出错。你必须衡量你的应用程序,只有优化慢的部分,如果需要。我不相信循环是你的应用程序的瓶颈。