इसे सीधे कॉल करने के बीच मुख्य अंतर (जो Invoke(...)
के लिए छोटा हाथ है) और DynamicInvoke
का उपयोग प्रदर्शन है; मेरे उपाय (नीचे) से * 700 से अधिक का एक कारक।
प्रत्यक्ष/Invoke
दृष्टिकोण के साथ, तर्क विधि हस्ताक्षर के माध्यम से पहले से ही मान्य हैं, और कोड सीधे उन तरीकों को पारित करने के लिए मौजूद है (मैं "आईएल के रूप में" कहूंगा, लेकिन मुझे याद है कि मुझे याद है रनटाइम इसे सीधे किसी भी आईएल के बिना प्रदान करता है)। DynamicInvoke
के साथ इसे प्रतिबिंब के माध्यम से सरणी से जांचना होगा (यानी वे सभी इस कॉल के लिए उपयुक्त हैं; क्या उन्हें अनबॉक्सिंग आदि की आवश्यकता है); यह धीमा (यदि आप इसे एक तंग पाश में उपयोग कर रहे हैं), और जहां संभव हो से बचा जाना चाहिए।
उदाहरण; परिणाम पहले (मैं पिछले संपादन से LOOP
गिनती वृद्धि हुई है, एक समझदार तुलना देने के लिए):
Direct: 53ms
Invoke: 53ms
DynamicInvoke (re-use args): 37728ms
DynamicInvoke (per-cal args): 39911ms
कोड के साथ:
static void DoesNothing(int a, string b, float? c) { }
static void Main() {
Action<int, string, float?> method = DoesNothing;
int a = 23;
string b = "abc";
float? c = null;
const int LOOP = 5000000;
Stopwatch watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++) {
method(a, b, c);
}
watch.Stop();
Console.WriteLine("Direct: " + watch.ElapsedMilliseconds + "ms");
watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++) {
method.Invoke(a, b, c);
}
watch.Stop();
Console.WriteLine("Invoke: " + watch.ElapsedMilliseconds + "ms");
object[] args = new object[] { a, b, c };
watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++) {
method.DynamicInvoke(args);
}
watch.Stop();
Console.WriteLine("DynamicInvoke (re-use args): "
+ watch.ElapsedMilliseconds + "ms");
watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++) {
method.DynamicInvoke(a,b,c);
}
watch.Stop();
Console.WriteLine("DynamicInvoke (per-cal args): "
+ watch.ElapsedMilliseconds + "ms");
}
स्रोत
2009-05-31 21:04:28
क्या आप यहां कोई जवाब स्वीकार नहीं करना चाहते हैं? मुझे पता है कि अब तक सवाल काफी पुराना है, लेकिन मुझे परेशान था कि अच्छे उम्मीदवार होने पर अभी भी कोई जवाब स्वीकार नहीं किया गया है। – NobodysNightmare