我指的帖子是this.当将大小增加到 100000000 时,不仅第一个对我来说运行得更快(563 毫秒比 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 毫秒。
三个测试,每个测试的结论都是预先存储限制是提高性能的最佳解决方案。我错过了什么吗?目前在我的程序中需要优化,因为需要处理大图片,并且在所有性能关键区域,我总是事先存储循环的边界以提高性能,这些测试似乎证实了这一点。
最佳答案
不,我觉得很合适;如果我运行这个:
int[] values = new int[100000000];
var watch = Stopwatch.StartNew();
int length = values.Length;
for (int i = 0; i < length; i++)
values[i] = i;
watch.Stop();
var hoisted = watch.ElapsedMilliseconds;
watch = Stopwatch.StartNew();
for (int i = 0; i < values.Length; i++)
values[i] = i;
watch.Stop();
var direct = watch.ElapsedMilliseconds;
并通过优化构建,从控制台运行;我得到的 direct
为 71,hoisted
为 163,这与我对 JIT 的期望相关,消除了对向量的越界检查(但仅在访问时直接)。
关于c# - 这个流行的 StackOverflow 答案不正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7084326/