यह सिर्फ एक कोड डिजाइन प्रश्न के बारे में मेरे साथ होता है। कहें, मेरे पास एक "टेम्पलेट" विधि है जो कुछ कार्यों को आमंत्रित करती है जो "बदल सकती हैं"। एक सहज डिजाइन "टेम्पलेट डिजाइन पैटर्न" का पालन करना है। Subclasses में ओवरराइड करने के लिए "आभासी" कार्यों को बदलने के लिए परिवर्तन कार्यों को परिभाषित करें। या, मैं केवल "वर्चुअल" के बिना प्रतिनिधि कार्यों का उपयोग कर सकता हूं। प्रतिनिधि कार्यों को इंजेक्शन दिया जाता है ताकि उन्हें भी अनुकूलित किया जा सके।सी #: वर्चुअल फ़ंक्शन आमंत्रण किसी प्रतिनिधि आमंत्रण से भी तेज़ है?
मूल रूप से, मैंने सोचा कि दूसरा "प्रतिनिधि" तरीका "वर्चुअल" तरीके से तेज़ होगा, लेकिन कुछ कोडिंग स्निपेट साबित करता है कि यह सही नहीं है।
नीचे कोड में, पहली DoSomething विधि "टेम्पलेट पैटर्न" का पालन करती है। यह आभासी विधि IsTokenChar पर कॉल करता है। दूसरी DoSomthing विधि वर्चुअल फ़ंक्शन पर निर्भर नहीं है। इसके बजाए, इसमें एक पास-इन प्रतिनिधि है। अपने कंप्यूटर में, पहली DoSomthing हमेशा दूसरे की तुलना में तेजी है। परिणाम 1645: 1780 की तरह है।
"आभासी आमंत्रण" गतिशील बाध्यकारी है और प्रत्यक्ष प्रतिनिधिमंडल आमंत्रण की तुलना में अधिक समय-लागत होना चाहिए, है ना? लेकिन परिणाम दिखाता है कि यह नहीं है।
किसी इस व्याख्या कर सकते हैं?
using System;
using System.Diagnostics;
class Foo
{
public virtual bool IsTokenChar(string word)
{
return String.IsNullOrEmpty(word);
}
// this is a template method
public int DoSomething(string word)
{
int trueCount = 0;
for (int i = 0; i < repeat; ++i)
{
if (IsTokenChar(word))
{
++trueCount;
}
}
return trueCount;
}
public int DoSomething(Predicate<string> predicator, string word)
{
int trueCount = 0;
for (int i = 0; i < repeat; ++i)
{
if (predicator(word))
{
++trueCount;
}
}
return trueCount;
}
private int repeat = 200000000;
}
class Program
{
static void Main(string[] args)
{
Foo f = new Foo();
{
Stopwatch sw = Stopwatch.StartNew();
f.DoSomething(null);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
{
Stopwatch sw = Stopwatch.StartNew();
f.DoSomething(str => String.IsNullOrEmpty(str), null);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
}
}
जॉन स्कीट के लिए एक, मुझे लगता है! ;) –
@ मिच: मैंने वास्तव में जवाब देने से पहले आपकी टिप्पणी नहीं देखी थी, लेकिन मैं flattered हूँ :) –
बीटीडब्ल्यू, मुझे लगता है कि एक अनुकूलित अनुकूलित –