【发布时间】:2012-10-30 09:10:12
【问题描述】:
我一直在研究 C# 迷宫生成器,它可以生成 128000x128000 像素的迷宫。所有内存使用都已优化,因此我目前正在考虑加快生成速度。
我发现的一个问题(远远超出兴趣点)如下(只是一些示例代码来说明问题):
当 pixelChanged 为 null 时,此代码在我的机器上运行大约 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 代码差异进行一些分析。 (所以这个问题实际上来自哪里)
编辑2: 所有代码均在发布模式下编译
【问题讨论】:
标签: c# performance compiler-construction