var value = source.Select(y => y.Id).Where(y => !string.IsNullOrEmpty(y)).ToList();
var value = source.Where(y => !string.IsNullOrEmpty(y.Id)).Select(y => y.Id).ToList();
[MemoryDiagnoser(false)]
public class Benchmarks
{
private DataObject[] Data { get; set; }
[GlobalSetup]
public void Setup()
{
Data = new DataObject[1000000];
for (int i = 0; i < Data.Length; i++)
{
Data[i] = new DataObject
{
Id = Guid.NewGuid().ToString(),
Name = Guid.NewGuid().ToString(),
};
}
}
[Benchmark]
public void WhereSelect()
{
var newColl = Data.Where(x => !string.IsNullOrEmpty(x.Id)).Select(x => x.Id).ToList();
}
[Benchmark]
public void SelectWhere()
{
var newColl = Data.Select(x => x.Id).Where(x => !string.IsNullOrEmpty(x)).ToList();
}
}
public class DataObject
{
public string Id { get; set; }
public string Name { get; set; }
}
1条答案
按热度按时间xoefb8l81#
我在上面做了一些基准测试:
数组被填充了1,000,000个元素,我在其中执行了两个方法。这是结果(
BenchmarkRunner.Run<Benchmarks>()
):| 方法|是说|误差|StdDev|分配|
| --|--|--|--|--|
| WhereSelect| 17.12毫秒|0.341毫秒|0.778毫秒|16 MB|
| 选择地点|20.83毫秒|0.549毫秒|1.619毫秒|16 MB|
所以你可以清楚地看到
.Select(...).Where(...)
更快。当然,这是一个非常大的数组。对于一个1000个元素的数组,这是结果:| 方法|是说|误差|StdDev|分配|
| --|--|--|--|--|
| WhereSelect| 5.955美元|0.1180 us| 0.1359 us| 16.31 KB|
| 选择地点|9.415美国|0.1596 us| 0.1493 us| 16.31 KB|
请注意,现在大约是 * 微秒。但我们仍然有一个明显的赢家。
请注意,这仅测试
Where
和Select
的IEnumerable
实现。对于IQueryable
,可能完全不同。