Po skompilowaniu Expression<T>
, wynikowy kod jest niejawnie zapisywany w pamięci podręcznej przez framework? Zastanawiam się nad metodami statycznymi Regex
, w których framework domyślnie kompiluje i buforuje ostatnie kilka wyrażeń regularnych.Po skompilowaniu wyrażenia <T> jest on domyślnie buforowany?
Jeśli skompilowane Expression<T>
obiekty są nie buforowane, można polecić kilka najlepszych praktyk dla utrzymywania w czasie kompilacji w dół ani żadnych gotchas, które mogą powodować problemy, jeśli ręcznie buforują wyrażenia?
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;
}
W tym przykładzie, jestem nieco zaniepokojony, że gdybym buforować skompilowany wyrażenie, że użyje wartości arg1
i arg2
jak były w momencie wyrażenie został skompilowany, zamiast pobierania tych wartości z odpowiedniego miejsca w stosie (tj. zamiast uzyskiwania aktualnych wartości).
Cześć Mark, nigdy nie spotkałem się z tego rodzaju optymalizacją. Czy możesz doradzić, czy jest to naprawdę przydatne pod względem wydajności, buforowania prekompilowanych zapytań? –