Разница между Invoke и DynamicInvoke
в чем разница между Invoke и DynamicInvoke в делегатах? Пожалуйста, дайте мне пример кода, который объясняет разницу между этими двумя методами.
1 ответов
когда у вас есть экземпляр делегата, вы можете узнать точный тип, или вы можете просто знать, что это Delegate
. Если вы знаете точный тип, вы можете использовать Invoke
, которая составляет очень быстро - все уже предварительно проверены. Например:
Func<int,int> twice = x => x * 2;
int i = 3;
int j = twice.Invoke(i);
// or just:
int j = twice(i);
это. Есть много дополнительных расходов здесь:
- массив
- проверка переданных аргументов является "подходящей" для фактического
MethodInfo
- распаковка и т. д. По мере необходимости
- отражение-invoke
- тогда вызывающий должен что-то сделать, чтобы обработать возвращаемое значение
в принципе, избежать DynamicInvoke
когда-нибудь вы можете. Invoke
всегда предпочтительнее, если все у вас есть Delegate
и object[]
.
для сравнения производительности в режиме выпуска за пределами отладчика (exe консоли) выводится следующее:
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);