dav*_*bro 4 c# string performance static
我是游戏程序员,所以我总是试图优化我的代码.我最近在玩弄循环,我遇到了一些让我感到困惑的事情.我创建了一个简单的控制台应用程序并创建了一个非静态类:
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到静态(sZin UpdateStatic)或非(Zin Update)的字符串中.
我跑了一个循环,结果如下: 
正如您所看到的,修改静态字符串变量所需的时间大约是修改非静态变量的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();
        }
    }
我找不到任何关于为什么会这样的事情.对不起,如果答案很明显.谢谢你的帮助.
在非静态版本中,您CL在循环的每次迭代中使用不同的实例.因此Z永远不会很长.
在静态版本中,sZ继续变得越来越长.  
创建字符串并追加运行时与其长度成比例,因此静态版本需要更长的时间.
对于整数,由于整数的值,运行时没有差异.这是因为在内部,所有整数在.net中都是相同的.(4字节)
| 归档时间: | 
 | 
| 查看次数: | 1001 次 | 
| 最近记录: |