जब Expression<T>
संकलित किया गया है, परिणामी कोड ढांचे द्वारा पूरी तरह से कैश किया गया है? मैं स्थिर Regex
विधियों की तर्ज पर सोच रहा हूं जहां ढांचा आखिरकार संकलित करता है और पिछले कुछ regexes कैश करता है।जब एक अभिव्यक्ति <T> संकलित है, तो क्या यह स्पष्ट रूप से कैश किया गया है?
तो संकलित Expression<T>
वस्तुओं कैश्ड नहीं हैं, तो आप या संकलन समय नीचे रखने के लिए कुछ सर्वोत्तम प्रथाओं किसी भी gotchas कि समस्याएं पैदा कर सकता है, तो मैं मैन्युअल रूप से एक अभिव्यक्ति कैश सिफारिश कर सकते हैं?
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
के मूल्यों का उपयोग करेगा के रूप में वे समय में कर रहे थे अभिव्यक्ति संकलित किया गया है, बल्कि उन मूल्यों को पुन: प्राप्त करने से ढेर में उपयुक्त जगह से (यानी वर्तमान मूल्य प्राप्त करने के बजाय)।
हाय मार्क, मैंने कभी इस तरह के अनुकूलन को कभी नहीं मिला है। क्या आप कृपया सलाह दे सकते हैं कि क्या यह पूर्ववर्ती प्रश्नों के कैशिंग को परफॉर्मेंस के मामले में वास्तव में सहायक है? –