2013-05-07 34 views
0

分析我的应用程序我发现一个不愉快的事实,那就是什么类型的Upadte构建器(和查询<>)会评估每个请求上的lambda表达式,并占用大量的CPU。您将获得几个CPU的百分比,从漂亮和现代类型化UpdateBuilder <>作为开关:如何加快在10gen官方MongoDB C#驱动程序中键入的建设者?

var u = Update<MyPerson>.Inc(e => e.Age, Age); 

到老好静态字符串:

var u = Update.Inc("Age", Age); 

同样问题的QueryBuilder <>,这是也评估每个请求的表达式,并浪费宝贵的CPU资源。

官方LINQ driver's page状态:

的C#编译器将使用的查询语法到 lambda语法内部反正写的所有问题,所以没有性能优势 或罚款或者选择风格。

是的,这是真的如果您选择两个LINQ语法之间。 但是,在使用和不使用LINQ语法之间有巨大的性能差异。开销取决于您的客户执行查询的频率。在我的情况下,差距超过30%!

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

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

回答

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

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

+0

是的,这是正确的,涉及“可用于编写LINQ查询的两种语法” - 没有任何区别。我已经更新了这个问题。 – 2013-05-10 12:46:13

+0

但是这并没有回答主要问题:为什么如果我们有“静态”文档属性定义,我们应该在每个请求上执行相当昂贵的LINQ查询?如果我的客户端主要用于MongoDb,它的硬件会消耗100%的CPU,只是为了产生更多的热量给环境。没有任何意义在每个请求上处理静态元数据。 我想使用LINQ语法,我真的很喜欢它。但不幸的是无法使用它,直到问题修复。 – 2013-05-10 12:50:33

+0

展望未来,存在以下性能问题:序列化BSON文档(MongoDB.Bson.IO.MultiChunkBuffer.WriteBackingBytes函数),并且经常使用GetCollection()函数,该函数也会占用CPU的几个百分比,并被汇集到我的应用程序希望你能尽快剖析和调整你的司机。提前致谢。我喜欢你的司机,喜欢听到关于它的表现的好消息。 – 2013-05-10 13:01:40

相关问题