উত্তর:
আপনার যখন কোনও প্রতিনিধি উদাহরণ রয়েছে, আপনি সঠিক ধরণটি জানেন বা আপনি হয়ত জানেন যে এটি একটি 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 টিরও বেশি কল তুলনা করছেন? এবং কেন প্রথমটি ফাংশনের দ্বিতীয় কলের চেয়ে বেশি সময় নেয়?