2012-12-01 40 views
5

मैं सी # में किए गए एक पीएसपी एमुलेटर का लेखक हूं।डायनामिक मोडस प्रीलिंक

मैं "DynamicMethod" ILGenerator का उपयोग कर के बहुत सारे पैदा कर रहा हूँ। मैं असेंबली कोड को एएसटी में परिवर्तित कर रहा हूं, और उसके बाद आईएल कोड उत्पन्न कर रहा हूं और डायनेमिक मोड का निर्माण कर रहा हूं। मैं इसे एक और थ्रेड में कर रहा हूं, इसलिए जब मैं प्रोग्राम दूसरों को निष्पादित कर रहा हूं तो मैं नई विधियां उत्पन्न कर सकता हूं ताकि यह आसानी से चल सके।

मेरी समस्या यह है कि देशी कोड पीढ़ी आलसी है, इसलिए जब मशीन को कॉल किया जाता है तो मशीन कोड उत्पन्न होता है, जब आईएल उत्पन्न नहीं होता है। तो यह थ्रेड निष्पादित प्रोग्राम में उत्पन्न होता है, देशी कोड पीढ़ी काफी धीमी है क्योंकि यह asm-> ast-> il step है।

मैं Marshal.Prelink विधि है कि यह समारोह निष्पादित करने से पहले मशीन कोड उत्पन्न करने के लिए माना जाता है की कोशिश की है। यह मोनो पर काम करता है, लेकिन यह एमएस .NET पर काम नहीं करता है।

Marshal.Prelink(MethodInfo); 

क्या एमएस .NET पर एक डायनामिक मोड को प्रीलिंक करने का कोई तरीका है?

मैं समारोह के लिए एक बूलियन पैरामीटर कहा कि अगर निर्धारित करते हैं, समारोह तुरंत ताकि कोई कोड वास्तव में क्रियान्वित किया जाता है बाहर निकालता है सोचा। मैं उस तरह से "प्रीलिंक" कर सकता था, लेकिन मुझे लगता है कि यह एक बुरा समाधान है जिसे मैं टालना चाहता हूं।

कोई विचार?

उत्तर

0

I found someone saying that creating a delegate to the dynamic method would force JIT:

एक प्रतिनिधि जिसका लक्ष्य विधि है बनाएँ। इसका क्या मतलब है?

This one sounds promising too:

Thread jitter = new Thread(() => 
{ 
    foreach (var type in Assembly.Load("MyHavyAssembly, Version=1.8.2008.8," + 
      " Culture=neutral, PublicKeyToken=8744b20f8da049e3").GetTypes()) 
    { 
    foreach (var method in type.GetMethods(BindingFlags.DeclaredOnly | 
         BindingFlags.NonPublic | 
         BindingFlags.Public | BindingFlags.Instance | 
         BindingFlags.Static)) 
    { 
     System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod(method.MethodHandle); 
    } 
    } 
}); 
jitter.Priority = ThreadPriority.Lowest; 
jitter.Start(); 
+1

मुझे वास्तव में समझ में नहीं आता कि एक प्रतिनिधि बल जेआईटी क्यों बनायेगा। और दूसरी विधि सीईआर (बाधित निष्पादन क्षेत्रों) के साथ प्रयोग की जानी चाहिए, यह सुनिश्चित नहीं है कि यह सही तरीका है। – svick

0

क्यों अपने काम नहीं कर रहा MSDN प्रलेखन के लिए के रूप में जानकारी पढ़ना निम्नलिखित ::

मंच आह्वान के बाहर एक विधि पर Prelink कॉलिंग कोई प्रभाव नहीं है कहते हैं।

मैं चुप विश्वास है कि अगर आप restrictedskipverification या skipverification का उपयोग यह विधि जीत जाएगा।

हालांकि यदि मैं गलत हूं तो आपका छोटा सर्किटिंग विचार खराब नहीं है।