c# - 通过与 Select 链接使用聚合运算符与不这样做之间的区别
问题描述
我想知道以下语句在性能和调用风格方面是否存在差异(例如,将表达式应用于所有序列或对象)。
var minPrice = SampleData.Books
.Min(book => book.Price);
var maxPrice = SampleData.Books
.Select(book => book.Price)
.Max();
或者
var nbCheapBooks1 = SampleData.Books
.Select(book => book.Price)
.Where(book => book < 30).Count();
var nbCheapBooks2 = SampleData.Books
.Select(book => book.Price)
.Count(book => book < 30);
var nbCheapBooks3 = SampleData.Books
.Count(book => book.Price < 30);
解决方案
刚刚根据您的样本创建了一个简单的基准测试,并添加了一种使用Where(book => book.Price < 30)
和计数进行过滤的方法(这应该是最快的方法)
[SimpleJob]
public class LinqBenchmark
{
private IEnumerable<Book> Books;
[GlobalSetup]
public void Setup()
{
Books = new List<Book>()
{
new Book { Price = 20 },
new Book { Price = 30 },
new Book { Price = 40 },
new Book { Price = 50 },
new Book { Price = 60 },
new Book { Price = 70 },
new Book { Price = 80 },
new Book { Price = 10 }
};
}
[Benchmark]
public int SelectWhereCount()
{
return Books.Select(book => book.Price).Where(book => book < 30).Count();
}
[Benchmark]
public int SelectCount()
{
return Books.Select(book => book.Price).Count(book => book < 30);
}
[Benchmark]
public int WhereCount()
{
return Books.Where(book => book.Price < 30).Count();
}
[Benchmark]
public int Count()
{
return Books.Count(book => book.Price < 30);
}
internal class Book
{
public int Price { get; internal set; }
}
}
Count
带有谓词的方法比其他方法工作得更快
您可以参考实现细节来查看和了解性能差异。Count(book => book.Price < 30)
如果得到,则将循环中的每个元素传递给Func<TSource, bool> predicate
并递增计数true
。
Where
并Select
在引擎盖下使用特殊WhereSelectEnumerableIterator
或WhereListIterator
类,然后计算计数。LINQ performance Count vs Where and Count thread中完美解释了工作速度更快的原因Where
,将其留在这里以供参考。Count
因此,就性能而言Books.Where(book => book.Price < 30).Count()
是最快的选项,就可读性而言,最后两个选项看起来更方便,IMO。
推荐阅读
- sql - Postgresql:仅在提供新值时才进行冲突更新
- sql-server - 为什么绑定到特定存储过程的子表单无法加载?
- command-line - 使用 parquet-tools 打开 parquet 文件时出错
- r - 使用偏移变量模拟负二项分布
- java - 如何基于使用私钥/密码的身份验证方法连接 SSH?
- jsonschema - 如何指定属性是否不应该存在或包含 null?
- laravel - 从 Laravel Cast 数组中的字段中检索值
- phpstorm - 如何让 PhpStorm 显示 C++ 库的 PHPDoc?
- angular - Angular [routerLink] 设置上下文路径
- excel - 在其他工作表中搜索多个标题(列),复制数据并粘贴到主文件中