我有一个带有存储库模式的应用程序。它允许我通过 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 分析我的代码时,我发现在高负载下,我在创建委托(delegate) elem => elem.Sensor.Id == sId && elem.MeasuringValue.Id == mvId 时缺乏性能。我的查询方法如下所示:public TOut Query<TOut>(Func<IQueryable<TEntity>, TOut> specification) 这意味着,我每次使用它时都会传递一个 Func<> 对象。那么问题来了,我该如何优化呢?

编辑 缺乏创建和编译的证明
c# - 委托(delegate)创建缺乏性能-LMLPHP

最佳答案

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

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;
    }
}

关于c# - 委托(delegate)创建缺乏性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31751142/

10-12 00:38