Alex Voskresenskiy
Alex Voskresenskiy

Reputation: 2233

Performance lack on delegate creation

I have an app with repository pattern. It allows me to manipulate objects via LINQ, objects are stored in memory, so I can access them very fast. Here a sample code:

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

When I profiled my code with dotTrace I found that on high load I get a performance lack on creating delegate elem => elem.Sensor.Id == sId && elem.MeasuringValue.Id == mvId. My Query method looks like: public TOut Query<TOut>(Func<IQueryable<TEntity>, TOut> specification) which means, that I really pass a Func<> object every time I use it. So, the question is, how can I optimize this?

EDIT proof of lack on creation and compilation enter image description here

Upvotes: 3

Views: 70

Answers (1)

recursive
recursive

Reputation: 86084

You can eliminate the compilation step by explicitly tracking the state in an object, rather than using a closure.

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

Upvotes: 4

Related Questions