मैंने गतिशील सी # कोड लिखने और संकलित करने के बारे में SO पर कई पोस्ट पढ़ी हैं। उदाहरण के लिए, this post। मैं समझता हूं कि इसे कई तरीकों से किया जा सकता है।देशी गति पर गतिशील रूप से संकलित सी # कोड चलाएं ... कैसे?
हालांकि, कोड आवेदक को कॉल करना धीमा है। मैंने एक साधारण बेंचमार्क किया, और यह देशी विधि को कॉल करने से कुछ 500 एक्स धीमी है।
मैं जो करना चाहता हूं वह एक डीएलएल लोड करने के बराबर है और इसकी विधियों में से एक को सीधे ("मूल रूप से") कॉल करना है, जो मुझे इच्छित गति लाभ देगा।
इस बारे में जाने का सबसे आसान तरीका क्या है? गतिशील कोड को एक डीएलएल में संकलित करें और फिर इसे लोड करें? क्या यह स्मृति में किया जा सकता है?
संपादित
मैं संकलन समय के बारे में परवाह नहीं है। केवल निष्पादन
public static int Execute(int i) { return i * 2; }
private void button30_Click(object sender, EventArgs e)
{
CSharpCodeProvider foo = new CSharpCodeProvider();
var res = foo.CompileAssemblyFromSource(
new System.CodeDom.Compiler.CompilerParameters()
{
GenerateInMemory = true,
CompilerOptions = @"/optimize",
},
@"public class FooClass { public static int Execute(int i) { return i * 2; }}"
);
var type = res.CompiledAssembly.GetType("FooClass");
var obj = Activator.CreateInstance(type);
var method = type.GetMethod("Execute");
int i = 0, t1 = Environment.TickCount, t2;
//var input = new object[] { 2 };
//for (int j = 0; j < 10000000; j++)
//{
// input[0] = j;
// var output = method.Invoke(obj, input);
// i = (int)output;
//}
//t2 = Environment.TickCount;
//MessageBox.Show((t2 - t1).ToString() + Environment.NewLine + i.ToString());
t1 = Environment.TickCount;
for (int j = 0; j < 100000000; j++)
{
i = Execute(j);
}
t2 = Environment.TickCount;
MessageBox.Show("Native: " + (t2 - t1).ToString() + Environment.NewLine + i.ToString());
var func = (Func<int, int>) Delegate.CreateDelegate(typeof (Func<int, int>), method);
t1 = Environment.TickCount;
for (int j = 0; j < 100000000; j++)
{
i = func(j);
}
t2 = Environment.TickCount;
MessageBox.Show("Dynamic delegate: " + (t2 - t1).ToString() + Environment.NewLine + i.ToString());
Func<int, int> funcL = Execute;
t1 = Environment.TickCount;
for (int j = 0; j < 100000000; j++)
{
i = funcL(j);
}
t2 = Environment.TickCount;
MessageBox.Show("Delegate: " + (t2 - t1).ToString() + Environment.NewLine + i.ToString());
}
क्या आपने संकलन समय को ध्यान में रखा है? आपका बेंचमार्क कैसा दिखता है? – Botz3000
सी # बिल्ड रनटाइम निष्पादित करना सी # बिल्डिंग को निष्पादित करने से 500x गुना धीमा नहीं है। वे समान हैं हालांकि विचार करने के लिए ओवरहेड हैं। आपका बेंचमार्क कैसा है, क्या आप प्रतिबिंबित करने के लिए प्रतिबिंब। प्रवेश या कुछ कंपाइलर सेवा का उपयोग कर रहे हैं? –
Invoke धीमा है, जो मेरे प्रश्न का केंद्र है: आप मूल गति पर विधि को कैसे कॉल कर सकते हैं? – IamIC