如何加速10gen官方MongoDB C#驱动程序中的类型构建器?

时间:2013-05-07 21:34:32

标签: mongodb mongodb-.net-driver

剖析我的应用程序我发现了一个令人不快的事实是什么类型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资源。

官方LINQ driver's page州:

  

C#编译器将使用查询语法编写的所有查询转换为   内部的lambda语法无论如何都没有性能优势   或选择任何一种风格的惩罚。

是的,如果你选择两种LINQ语法,那就是但是使用和不使用LINQ语法之间存在巨大的性能差异。开销取决于客户端执行查询的频率。就我而言,差异超过30%!

有什么方法可以将良好的类型语法和性能结合在一起,我想知道吗?

对于构建器结果的简单缓存不是一个答案,因为我们显然需要将动态参数传递给每个请求。我们需要找到“预编译”CPU昂贵部分(关于lambda表达式评估)的方法,但保留动态参数(例如数组索引)。

1 个答案:

答案 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时间。

我们希望将来尽可能减少开销,但请记住,此开销仅在客户端发生,不会影响服务器。