【发布时间】:2011-08-16 20:07:19
【问题描述】:
我指的帖子是this. 不仅第一个在将大小增加到 100000000 时对我来说运行得更快(563 MS 与 630 相比),而且在过去使用 for 循环中的属性造成了相当大的速度减慢。
在编写波形查看器时,每帧平均需要 23 毫秒来处理。循环遍历整个图片像素的 for 循环是导致速度下降的原因。我没有在 for 循环之前存储图片的宽度和高度,而是在每次迭代期间访问它。更改后,处理单个帧的时间从 23 毫秒变为仅 3 毫秒。
另外,我制作了这个示例类:
class LOL
{
private int x;
public LOL(int x)
{
this.x = x;
}
public int X
{
get
{
return x;
}
}
}
然后我创建了一个循环 500000000 次的 for 循环。一个测试在循环开始之前将 X 存储在一个整数变量中,一个测试在每次迭代期间访问 X 属性。前者大约需要 1,500 毫秒,而后者大约需要 8,000 毫秒。
三个测试,每个测试的结果都是预先存储限制是性能提升的最佳解决方案。我错过了什么吗?目前在我的程序中需要优化,因为要处理大图片,并且在所有性能关键区域中,我总是预先存储循环的边界以获得性能提升,这些测试似乎证实了这一点。
【问题讨论】:
-
“过去在 for 循环中使用属性会导致相当大的速度减慢” - 这完全取决于循环的确切性质。当使用数组执行此操作时,JIT 获取提示并执行一些边界检查消除循环内的数组访问。这与您的测试不同,听起来它实际上并没有在循环中做任何事情......
-
我假设您运行的是发行版,没有附加调试器?
-
你在比较苹果和橘子。图像的 Width 和 Height 属性与数组大小无关。是的,它们很昂贵,它需要通过非托管 GDI+ 代码来回往返。您总是希望在循环之前将它们检索到局部变量中。
标签: c# performance optimization