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