gpt4 book ai didi

c# - 静态字符串与非静态字符串

转载 作者:太空狗 更新时间:2023-10-30 00:24:48 26 4
gpt4 key购买 nike

我是一名游戏程序员,所以我一直在努力优化我的代码。我最近在玩循环,我遇到了一些让我有点困惑的事情。我创建了一个简单的控制台应用程序并创建了一个非静态类:

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添加到静态字符串上(UpdateStatic 中的sZ)或不(Update 中的Z)。

我运行了一个循环,结果如下: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();
}

}

我找不到任何关于为什么会发生这种情况的信息。抱歉,如果答案很明显。感谢您的帮助。

最佳答案

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

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

创建字符串并附加的运行时间与其长度成正比,因此静态版本需要更长的时间。

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

关于c# - 静态字符串与非静态字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21691193/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com