gpt4 book ai didi

c# - 循环中方法调用的开销是多少?

转载 作者:太空狗 更新时间:2023-10-29 22:16:35 26 4
gpt4 key购买 nike

我一直在研究 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。这不奇怪吗?我尝试在调试和 Release模式下编译解决方案,但没有发现任何明显的差异。

这意味着我在此循环中进行的每个方法调用都会使我的代码减慢大约 0.4 秒。由于迷宫生成器代码目前由许多单独的方法调用组成,这些方法调用执行不同的操作,因此开始获得大量资金。

我还查看了 google 和 Stack Overflow 上的其他帖子,但还没有真正找到解决方案。

是否可以像这样自动优化代码? (也许使用 Roslyn 项目之类的东西???)还是我应该将所有内容放在一个大方法中?

编辑:我也有兴趣对这两种情况下的 JIT/CLR 代码差异进行一些分析。 (那么这个问题到底是从哪里来的)

编辑2:所有代码都是在 Release模式下编译的

最佳答案

这是一个问题,JIT 对方法进行了内联优化(其中整个方法代码实际上被注入(inject)到调用父代码中),但这只发生在编译为 32 字节或更少字节的方法上。我不知道为什么存在 32 字节限制,并且还希望在 C# 中看到一个“内联”关键字,就像在 C/C++ 中一样,正是为了解决这些问题。

关于c# - 循环中方法调用的开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13135759/

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