উত্তর:
আপনার যখন কোনও প্রতিনিধি উদাহরণ রয়েছে, আপনি সঠিক ধরণটি জানেন বা আপনি হয়ত জানেন যে এটি একটি Delegate। আপনি যদি সঠিক ধরনটি জানেন তবে আপনি ব্যবহার করতে পারবেন Invokeযা খুব দ্রুত - সবকিছু ইতিমধ্যে প্রাক-বৈধ। উদাহরণ স্বরূপ:
Func<int,int> twice = x => x * 2;
int i = 3;
int j = twice.Invoke(i);
// or just:
int j = twice(i);
যাহোক! যদি আপনি কেবল এটি জানেন Delegateতবে এটি প্যারামিটারগুলি ম্যানুয়ালি সমাধান করতে হবে - এতে আনবক্সিং ইত্যাদি জড়িত থাকতে পারে - প্রচুর প্রতিচ্ছবি চলছে। উদাহরণ স্বরূপ:
Delegate slowTwice = twice; // this is still the same delegate instance
object[] args = { i };
object result = slowTwice.DynamicInvoke(args);
দ্রষ্টব্য আমি জড়িত argsতা পরিষ্কার করার জন্য দীর্ঘ হাতটি লিখেছি an object[]এখানে প্রচুর অতিরিক্ত ব্যয় হয়:
MethodInfoমূলত, DynamicInvokeআপনি যখন পারেন তখন এড়িয়ে চলুন । Invokeআপনার কাছে থাকা সমস্তগুলি একটি Delegateএবং একটি না হলে সর্বদা পছন্দসই object[]।
একটি পারফরম্যান্স তুলনার জন্য, ডিবাগারের বাইরে নিম্নলিখিতটি প্রকাশের মোডে (একটি কনসোল এক্সপি) প্রিন্ট করে:
Invoke: 19ms
DynamicInvoke: 3813ms
কোড:
Func<int,int> twice = x => x * 2;
const int LOOP = 5000000; // 5M
var watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++)
{
twice.Invoke(3);
}
watch.Stop();
Console.WriteLine("Invoke: {0}ms", watch.ElapsedMilliseconds);
watch = Stopwatch.StartNew();
for (int i = 0; i < LOOP; i++)
{
twice.DynamicInvoke(3);
}
watch.Stop();
Console.WriteLine("DynamicInvoke: {0}ms", watch.ElapsedMilliseconds);
Invoke: 0,0478ms, DynamicInvoke: 0,053ms। আপনি কেন তাদের সাথে 1 টিরও বেশি কল তুলনা করছেন? এবং কেন প্রথমটি ফাংশনের দ্বিতীয় কলের চেয়ে বেশি সময় নেয়?