我有一个带有存储库模式的应用程序。它允许我通过 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<>
对象。那么问题来了,我该如何优化呢?编辑 缺乏创建和编译的证明
最佳答案
您可以通过显式跟踪对象中的状态而不是使用闭包来消除编译步骤。
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/