小编Mik*_*keJ的帖子

在 .NET Core 中,for 和 foreach 现在在迭代值类型数组时相同吗?

我的问题: 我想知道三件事。首先,在 .NET Core 中,“foreach”循环是否针对与“for”循环相同的代码进行了优化,这是否特定于 .NET Core?使用 ILSpy 查看编译后的代码表明“foreach”被视为 for 循环。

其次,我想让一些人知道我使用 BenchmarkDotNet 的测试是否有缺陷,或者是否很难在桌面上使用 .NET 获得一致的结果。结果有很多变化,我不确定它们是否都有用。

最后,我想看看是否有人可以确认迭代值类型数组(尤其是大型结构数组)的最佳方法是使用带有 ref 迭代器变量的 foreach。像这样:

        var data = this.Data.AsSpan();
        foreach (ref var d in data)
        {
            if (d.Equals(Check))
                ++count;
        }
Run Code Online (Sandbox Code Playgroud)

更多细节: 我正在优化一些需要迭代结构数组的代码。我记得我之前看到过“for”循环比“foreach”快一些的指导。但是,正如此处所见,该指南已经很旧。SO 答案仍然是第一个出现的答案,但它已有 11 年的历史了。

我还注意到这个 SO答案是最近的,它着眼于 .NET 核心的新功能 - span 和 ref 变量。但结果令人惊讶的是“for 循环”似乎更慢。

鉴于第二个答案的结果似乎与我决定自己测试的旧指南相矛盾。

我认为迭代值类型数组的最快方法 - 使用指针 - 在大多数情况下是最快的,但并非总是如此。在大多数情况下,将 foreach 与 by ref 迭代器变量一起使用,结果与指针相同。

但结果在哪里不是很一致。我在展示的运行中使用了 10,000 个元素。我也用了50万。结果仍然与较大的数据大小不一致。

代码: 我跳过了第二个答案中使用的自定义枚举器,而是使用指针添加了一个 while 循环。看起来像这样:

    [Benchmark]
    public int RefInc() …
Run Code Online (Sandbox Code Playgroud)

c# foreach for-loop .net-core

5
推荐指数
0
解决办法
271
查看次数

标签 统计

.net-core ×1

c# ×1

for-loop ×1

foreach ×1