代表创建的绩效不足

时间:2015-07-31 16:40:14

标签: c# performance linq lambda

我有一个带存储库模式的应用。它允许我通过LINQ操作对象,对象存储在内存中,因此我可以非常快速地访问它们。这是一个示例代码:

private Measurement ParseExact(AgentParameter agentParameter)
{
    ControlledElement ce;
    using (var repositoryBase = Datastore.GetRepository<ControlledElement>())
    {
        var mvId = Convert.ToInt32(agentParameter.ControlledParameterId);
        var sId = Convert.ToInt32(agentParameter.FacilityId);
        ce =
            repositoryBase.Query(
                t => t.FirstOrDefault(elem => elem.Sensor.Id == sId && elem.MeasuringValue.Id == mvId));
    }
}

当我使用dotTrace分析我的代码时,我发现在高负载下,我在创建委托elem => elem.Sensor.Id == sId && elem.MeasuringValue.Id == mvId时表现不佳。我的查询方法如下: public TOut Query<TOut>(Func<IQueryable<TEntity>, TOut> specification)这意味着,每次使用它时我都会传递一个Func<>对象。所以,问题是,我该如何优化呢?

编辑证明缺乏创建和编译 enter image description here

1 个答案:

答案 0 :(得分:4)

您可以通过显式跟踪对象中的状态来消除编译步骤,而不是使用闭包。

private Measurement ParseExact(AgentParameter agentParameter)
{
    ControlledElement ce;
    using (var repositoryBase = Datastore.GetRepository<ControlledElement>())
    {
        var mvId = Convert.ToInt32(agentParameter.ControlledParameterId);
        var sId = Convert.ToInt32(agentParameter.FacilityId);
        var query = new ParseExactQuery(mvId, sId);
        ce = repositoryBase.Query(t => t.FirstOrDefault(query.Query));
    }
}

private class ParseExactQuery {
    private int mvId;
    private int sId;

    public ParseExactQuery (int mvId, int sId) {
        this.mvId = mvId;
        this.sId = sId;
    }

    public bool Query(ControlledElement elem) {
        return elem.Sensor.Id == sId && elem.MeasuringValue.Id == mvId;
    }
}