c# - 这个流行的 StackOverflow 答案不正确吗?

标签 c# performance optimization

我指的帖子是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/

相关文章:

c# - MDI Parent Form问题设置Parent

c# - Windows 8.1 运行时 (C#) - 将 HttpResponseMessage 内容转换为 BitmapImage

c# - 使用大数据填充 DataGridView 时性能低下

c++ - 数组访问中的二进制搜索是否比使用哈希表更快?

c# - ServiceStack.Redis 类型的客户端不保存值

c# - 更改枚举显示

MySQL 带有带有 acCount 和 SubQuery Select 的 IF 语句

java - Math.pow(a,n) JAVA的时间复杂度

optimization - 使用共享库进行 GCC 配置文件引导优化,无法控制可执行文件

使用 LIMIT 选项优化 MySQL RAND()