我一直在研究 C# 迷宫生成器,它可以生成 128000x128000 像素的迷宫。所有内存使用都已经优化,所以我目前正在考虑加快生成速度。
我发现的一个问题(远远超出兴趣点)如下(只是一些示例代码来说明问题):
当 pixelChanged 为空时,此代码在我的机器上运行大约 1.4 秒:
public void Go()
{
for (int i = 0; i < bitjes.Length; i++)
{
BitArray curArray = bitjes[i];
for (int y = 0; y < curArray.Length; y++)
{
curArray[y] = !curArray[y];
GoDrawPixel(i, y, false);
}
}
}
public void GoDrawPixel(int i, int y, Boolean enabled)
{
if (pixelChanged != null)
{
pixelChanged.Invoke(new PixelChangedEventArgs(i, y, enabled));
}
}
以下代码的运行速度实际上快了 0.4 秒
public void Go()
{
for (int i = 0; i < bitjes.Length; i++)
{
BitArray curArray = bitjes[i];
for (int y = 0; y < curArray.Length; y++)
{
curArray[y] = !curArray[y];
if (pixelChanged != null)
{
pixelChanged.Invoke(new PixelChangedEventArgs(i, y, false));
}
}
}
}
似乎只调用一个“空”方法会占用该算法使用的大约 20% 的 cpu。这不是很奇怪吗?我尝试在调试和发布模式下编译解决方案,但没有发现任何明显的差异。
这意味着我在这个循环中的每个方法调用都会使我的代码减慢大约 0.4 秒。由于迷宫生成器代码目前由许多执行不同操作的单独方法调用组成,这开始获得大量。
我还检查了 Google 和 Stack Overflow 上的其他帖子,但还没有真正找到解决方案。
是否可以像这样自动优化代码?(也许像 Roslyn 项目这样的东西???)或者我应该把所有东西放在一个大方法中?
编辑:我也可能对这两种情况下的 JIT/CLR 代码差异进行一些分析。(所以这个问题实际上来自哪里)
Edit2: 所有代码都是在发布模式下编译的