剖析我的应用程序我发现了一个令人不快的事实是什么类型Upadte<> (和Query<>)构建器评估每个请求上的lambda表达式,消耗大量CPU。您将获得几个百分比的CPU ,从漂亮和现代的类型UpdateBuilder转换<>为:
var u = Update<MyPerson>.Inc(e => e.Age, Age);
旧的静态字符串:
var u = Update.Inc("Age", Age);
与QueryBuilder相同的问题&lt;&gt;,它还会评估每个请求上的表达式,并且无需浪费宝贵的CPU资源。
C#编译器将使用查询语法编写的所有查询转换为 内部的lambda语法无论如何都没有性能优势 或选择任何一种风格的惩罚。
是的,如果你选择两种LINQ语法,那就是。 但是使用和不使用LINQ语法之间存在巨大的性能差异。开销取决于客户端执行查询的频率。就我而言,差异超过30%!
有什么方法可以将良好的类型语法和性能结合在一起,我想知道吗?
对于构建器结果的简单缓存不是一个答案,因为我们显然需要将动态参数传递给每个请求。我们需要找到“预编译”CPU昂贵部分(关于lambda表达式评估)的方法,但保留动态参数(例如数组索引)。
答案 0 :(得分:0)
您引用的段落:
C#编译器将使用查询语法编写的所有查询转换为 内部的lambda语法,所以没有性能优势或 选择任何一种风格都会受到惩罚。
指可用于编写LINQ查询的两种语法。
var query =
from e in collection.AsQueryable<Employee>()
where e.FirstName == "John"
select e;
或
var query =
collection.AsQueryable<Employee>()
.Where(e => e.FirstName == "John");
这并不意味着LINQ查询通常没有开销。所有LINQ查询必须在运行时转换为等效的MongoDB查询,并且该过程需要一定的CPU时间。
我们希望将来尽可能减少开销,但请记住,此开销仅在客户端发生,不会影响服务器。