Когда скомпилирован Expression<T>
, возникает ли код, неявно кэшированный каркасом? Я думаю по строкам статических методов Regex
, где структура неявно компилирует и кэширует последние несколько регулярных выражений.Когда компилируется выражение <T>, оно неявно кэшируется?
Если скомпилированные Expression<T>
объекты не кэшируются, вы можете порекомендовать некоторые лучшие практики для поддержания времени компиляции вниз или каких-либо подводные камни, которые могут вызвать проблемы, если я вручную кэшировать выражение?
public MyResultType DoSomething(int arg1, int arg2)
{
var result = invokeHandler(
(IDoSomethingHandler h) => h.DoSomething(arg1, arg2)
);
return result;
}
private TResult invokeHandler<T, TResult>(Expression<Func<T, TResult>> action)
where T : class
{
// Here, I might want to check to see if action is already cached.
var compiledAction = action.Compile();
var methodCallExpr = action as MethodCallExpression;
// Here, I might want to store methodCallExpr in a cache somewhere.
var handler = ServiceLocator.Current.GetInstance<T>();
var result = compiledAction(handler);
return result;
}
В этом примере, я немного обеспокоен тем, что, если я кэшировать скомпилированное выражение, что он будет использовать значение arg1
и arg2
, как они были в то время выражение было составлено, а не получение этих значений из соответствующего места в стеке (т.е. вместо получения текущих значений).
Привет, Марк, я никогда не встречал таких оптимизаций. Можете ли вы сообщить, действительно ли это полезно с точки зрения производительности, кэширования предварительно скомпилированных запросов? – 2014-07-31 06:48:42