【发布时间】:2018-10-09 14:48:44
【问题描述】:
这个问题是关于从性能角度比较 foreach 和 Linq 方法的。
下面我带来的代码只是我目前的一个例子。
与 foreach 循环相比,使用 .Where().Select() 是否有优势(从性能的角度来看)?
我有这个 C# 块,我想在这里提高性能:
var resultList = new List<MyItemWrapper>();
foreach (var key in KeysCollection)
{
if (SomeCondition(key))
{
var anotherKey = CreateAnotherKey(key);
if (AnotherCondition(anotherKey))
{
resultList.Add(new MyItemWrapper { Id = key });
}
}
}
我曾尝试使用 Where().Select() 并且也尝试过使用 AsPArallel() 但性能没有任何改进。相反,我发现性能越来越差。
var resultList = KeysCollection
.Where(key =>
{
if (!SomeCondition(key))
return false;
var anotherKey = CreateAnotherKey(key);
return AnotherCondition(anotherKey);
})
.Select(key => new MyItemWrapper { Id = key })
.ToList();
注意事项:
-
SomeCondition()和AnotherCondition()应被视为黑盒。 - 返回的
resultList应该是IList。 -
KeysCollection的类型为ICollection
有人可以帮忙并给出改进的建议吗?
【问题讨论】:
-
您是否通过分析器运行代码以查看瓶颈在哪里?你要处理多少把钥匙?也许慢是在其中一种黑盒方法中,在这种情况下,您的循环构造不会产生任何影响。
-
看起来你可以简单地使用github.com/dotnet/BenchmarkDotNet并将结果发布到这个问题中
-
Linq 方法本质上只是调用
foreach循环,你为什么认为它会执行得更好?我想CreateAnotherKey()和/或AnotherCondition()是瓶颈...... -
感谢所有 cmets。我的主要问题是关于 foreach 与 LINQ 方法的性能。如果其中任何一个比另一个有任何明显的优势。与黑盒方法无关。应该允许我们并行运行的 AsParallel() 怎么样?为什么它也没有帮助?我也试过了。
标签: c# performance foreach