这个流行的StackOverflow答案是否不正确?

Joh*_*ith 4 c# optimization performance

我指的是这个帖子.当将大小增加到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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我做了一个循环,循环次数为5000000次.一个测试在循环开始之前将X存储在整数变量中,并且在每次迭代期间访问X属性.前者约需1,500毫秒,后者约为8,000毫秒.

三个测试,每个测试都得出结论,存储前限是业绩增益的最佳解决方案.我错过了什么吗?目前在我的程序中需要优化,因为处理大图片并且在所有性能关键区域中我总是存储环路的边界以获得性能增益,并且这些测试似乎证实了这一点.

Mar*_*ell 5

不,它看起来对我来说; 如果我运行这个:

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;
Run Code Online (Sandbox Code Playgroud)

并通过优化构建,从控制台运行; 我得到direct71和hoisted163,这与我对JIT的期望有关,消除了对向量的越界检查(但仅在直接访问时).