2014-02-11 115 views
4

我是一名游戏程序员,所以我总是试图优化我的代码。我最近在玩弄循环,我遇到了一些让我困惑的事情。我创建了一个简单的控制台应用程序,创建了一个非静态类:静态字符串vs非静态字符串

public class CL 
{ 
    static int X; 
    string Z; 
    static string sZ; 

    public CL(int x, int y, string z) 
    { 
     X = x + 1; 
     Z = z; 
     sZ = z; 
    } 

    public void Update(int i) 
    { 
     X *= i + 1; 
     X = X/2; 
     Z += i.ToString() ; 
    } 

    public void UpdateStatic(int i) 
    { 
     X *= i + 1; 
     X = X/2; 
     sZ += i.ToString(); 
    } 
} 

有两种方法都执行相同的操作:它们都修改静态整数X,然后他们添加到字符串的整i即静态(sZUpdateStatic)或不(ZUpdate)。

我跑了一个循环,而这里的结果:enter image description here

正如你可以看到,修改静态字符串变量了约260倍,只要修改非静态的(它可以杀死一个游戏的FPS) 。我试着把整数X都设为静态而不是,但是没有性能差异。所以我的问题是:为什么修改静态字符串会伤害性能?,但修改一个静态整数不伤害?以下是其余代码:

static void Main(string[] args) 
    { 
     while (Console.ReadLine() != "Q") 
     { 
      int count = 20000; 
      List<CL> l = new List<CL>(); 
      List<CL> sl = new List<CL>(); 
      for (int i = 0; i < count; i++) 
      { 
       var cl = new CL(i, i * 2, ""); 
       l.Add(cl); 
       sl.Add(cl); 
      } 
      Stopwatch s = new Stopwatch(); 
      s.Start(); 
      for (int i = 0; i < count; i++) 
      { 
       l[i].Update(i); 
      } 
      s.Stop(); 
      Console.WriteLine(s.Elapsed + " unsorted list modifying non-static variable"); 
      s.Reset(); 

      s.Start(); 
      for (int i = 0; i < count; i++) 
      { 
       sl[i].UpdateStatic(i); 
      } 
      s.Stop(); 
      Console.WriteLine(s.Elapsed + " unsorted list modifying static variable"); 
      s.Reset(); 
     } 

    } 

我找不到任何有关为什么会发生这种情况。对不起,如果答案很明显。谢谢你的帮助。

回答

9

在非静态版本中,您在循环的每次迭代中都使用CL的不同实例。因此Z永远不会很长。

在静态版本中,sZ继续变得越来越长。

创建一个字符串并追加运行时间与其长度成正比,所以静态版本需要更长的时间。

至于整数,由于整数的值,在运行时没有差别。这是因为在内部,所有整数在.net中都是相同的大小。 (4字节)

+0

@davidsbro:查看我编辑的关于int的信息。 – recursive

相关问题