2009-06-04 46 views
4

我想知道在循环中分配字符串变量的最有效方式是什么。因此,举例来说,如果我有通过节点列表浏览和节点的值赋给一个字符串,它会更好,如果我定义一个变量,在循环开始像C#为循环中的字符串赋值的最佳方法

string myStringVariable = string.Empty 
foreach(XmlNode node in givenNodes) 
{ 
    myStringVariable = node.Value; 
    .... 
    ... 
} 

之前或将如果我定义循环内的变量更有效,如

foreach(XmlNode node in givenNodes) 
{ 
    string myStringVariable = node.Value; 
    .... 
    ... 
} 

我认为第一种方法更高效,而第二种方法看起来更优雅。两者之间有性能差异吗?

谢谢你的答案。

+0

也许你可以在你的问题中格式化源代码部分。标记并使用'Ctrl + K'或代码示例按钮。 – crauscher 2009-06-04 12:27:30

回答

1

没有,两者之间没有真正的性能差异。 VM将认识到它只需要为堆栈中的一个额外变量分配空间。

13

使用现代编译器,这并不会造成任何性能差异,您应该始终使用最符合您算法的方式。也就是说,如果不需要最后一次迭代中的变量值,则首选第二个变体。

+0

对不起,你好像实际上是对的! (删除投票)我有一种倾向,总是忘记编译器优化... – Noldorin 2009-06-04 12:48:22

+0

没有冒犯。 – 2009-06-04 12:50:54

1

我通常不会优化到这个级别,因为我期望JIT编译器能够在运行时像这样执行优化。话虽如此,我从来没有实际比较这两个。当然,如果你确实需要最大的性能,那么值得用两种方式进行测试(使用足够数量的迭代和发布版本)。

6

我猜的主要问题是:你是否需要在你的代码中进一步使用该字符串变量,或者它的使用仅限于for循环的范围?如果它仅限于for循环的范围,则必须在循环内声明它。我怀疑这样做会对性能造成任何影响,但这应该是保持适当范围的变量的次要因素。

1

为什么不在控制台应用程序中设置一个小测试并对其进行测试。 这两种方法的结果都非常接近。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Diagnostics; 

namespace stringtestloop 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Stopwatch w = new Stopwatch(); 
      int itterations = 1024 * 1024 * 512; 

      w.Start(); 
      string var1 = string.Empty; 
      for (var i = 0; i < itterations; i++) 
      { 
       var1 = "some string"; 
      } 
      w.Stop(); 

      Console.WriteLine("outside: {0} ms", w.ElapsedMilliseconds); 

      w.Reset(); 

      w.Start(); 
      for (var i = 0; i < itterations; i++) 
      { 
       string var2 = "some string"; 
      } 
      w.Stop(); 

      Console.WriteLine("inside: {0} ms", w.ElapsedMilliseconds); 
      Console.ReadKey(); 
     } 
    } 
} 

编辑:

下一个问题要问自己是...是536870912(1024 * 1024 * 512)类似的号码,你会如何处理合作。如果没有,如果你的电话号码会少得多,那么你真的不会注意到它的差别。

0

我怀疑是否有任何显着的性能差异,因为在这两种情况下,您只是获取对XmlNode.Value的引用,而不是创建新字符串。

但是,您通常不应该担心优化这些情况。只需在它将要使用的范围内声明变量,并让编译器发挥它的魔力。

1

由于事实上,字符串是不可变的,.net与引用一起工作,所以两种方法之间没有性能差异。

也许第一个会慢一点,因为有一个(不需要的)myStringVariable的一组string.Empty。但我认为这些问题将由编译器和JIT保存,因此在性能方面两者没有区别。

最后但并非最不重要的是有一个范围的差异。因此,在需要变量的适当范围内声明该变量。

相关问题