SubSonic LINQ查询比SubSonic.Query.Select慢3倍

时间:2010-12-30 13:30:49

标签: c# linq subsonic subsonic3

我开发的模块会进行大量的小选择,插入和更新。 SubSonic.Query命名空间(ActiveRecord is not my weapon of choice)中的命令所做的修改似乎比用LINQ编写的逐个id选择查询快得多。

执行以下LINQ查询1000次

需要7.15秒
long a = (
    from u in UserCollection
    where u.UserId == value
    select u.UserId
).FirstOrDefault<long>();

Select查询

的千次运行只有2.38秒
long a = new SubSonic.Query.Select(provider, "UserId").From<User>()
    .Where<User>(x => x.UserId == value).ExecuteScalar<long>();

我花了一些时间来看看SubSonic中的LINQ。分析器告诉DbQueryProvider.Execute调用的大部分处理器时间花费在DbQueryProvider.GetExecutionPlan方法中 - 64%。当System.Linq.Expressions.Complie仅使用6%的时间时,DbQueryProvider.Execute花费了22%。

我对SubSonic LINQ查询如何解析和编译完全满意。但是,使用编译工具来重复SubSonic LINQ查询就像System.Data.Linq.CompiledQuery中的Linq2Sql一样。

1 个答案:

答案 0 :(得分:0)

我们也对此进行了一些分析,发现SubSonic的记录.SingleOrDefault(x =&gt; x.id = someval)比通过CodingHorror完成的同一查询慢20倍。在此处记录:https://github.com/subsonic/SubSonic-3.0/issues/258

分析器在ExecutionBuilder.cs中指出了这一点:

// this sucks, but since we don't track true SQL types through the query, and ADO throws exception if you
// call the wrong accessor, the best we can do is call GetValue and Convert.ChangeType
Expression value = Expression.Convert(
    Expression.Call(typeof (Convert), "ChangeType", null,
                    Expression.Call(reader, "GetValue", null, Expression.Constant(iOrdinal)),
                    Expression.Constant(TypeHelper.GetNonNullableType(column.Type), typeof(Type))
        ),
    column.Type
    );

令人失望,因为我非常喜欢SubSonic / Linq。

最后我们放弃了,我写了这个 - http://www.toptensoftware.com/petapoco。移植后,我们的负载测试显示每秒请求数增加,CPU负载从大约80%下降到5%。