¿Cuál es la diferencia entre Invoke y DynamicInvoke en los delegados? Por favor, dame un ejemplo de código que explique la diferencia entre esos dos métodos.Diferencia entre Invoke y DynamicInvoke
Respuesta
Cuando tiene una instancia de delegado, puede saber el tipo exacto, o simplemente puede saber que es un Delegate
. Si conoce el tipo exacto, puede usar Invoke
, que es muy rápido - todo ya está previamente validado. Por ejemplo:
Func<int,int> twice = x => x * 2;
int i = 3;
int j = twice.Invoke(i);
// or just:
int j = twice(i);
¡Sin embargo! Si simplemente sabe que es Delegate
, tiene que resolver los parámetros, etc. manualmente, esto podría implicar el desempaquetado, etc., se está produciendo una gran cantidad de reflexión. Por ejemplo:
Delegate slowTwice = twice; // this is still the same delegate instance
object[] args = { i };
object result = slowTwice.DynamicInvoke(args);
Nota He escrito el args
larga mano para que quede claro que un object[]
está involucrado. Hay un montón de gastos adicionales aquí:
- la matriz
- validar los argumentos pasados son un "ajuste" para el actual
MethodInfo
- unboxing etc., según sea necesario
- reflexión invocar
- entonces el la persona que llama necesita hacer algo para procesar el valor de retorno
Básicamente, evite DynamicInvoke
siempre Tu puedes. Invoke
siempre es preferible, a menos que todo lo que tiene es Delegate
y object[]
.
Para una comparación de rendimiento, el siguiente en modo de lanzamiento fuera del depurador (un exe consola) impresiones:
Invoke: 19ms
DynamicInvoke: 3813ms
Código:
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);
- 1. ¿Cuál es la diferencia entre Invoke() y BeginInvoke()
- 2. ¿Cuál es la diferencia entre llamar a un delegado directamente, usar DynamicInvoke y usar DynamicInvokeImpl?
- 3. diferencias de rendimiento entre P/Invoke y C envolturas ++
- 4. Diferencia entre std :: result_of y decltype
- 5. MySQL: diferencia entre ', `,' y"
- 6. Diferencia entre objeto y *?
- 7. Diferencia entre. y #
- 8. ¿Diferencia entre == y caso?
- 9. La diferencia entre $ * y $ @
- 10. Diferencia entre & y &
- 11. VBA: Diferencia entre y y +
- 12. Diferencia entre -Wconversion entre gcc y g ++
- 13. Invoke ToolStripMenuItem
- 14. ¿Cuál es la diferencia entre invocar y BeginInvoking a MessageBox?
- 15. Diferencia entre subprocess.Popen y os.system
- 16. Diferencia entre decimal y decimal
- 17. ¿Diferencia entre trazo y relleno?
- 18. Diferencia entre interrupción y eventos
- 19. Diferencia entre netTcpContextBinding y netTcpBinding
- 20. ¿Diferencia entre brújula y sass?
- 21. Diferencia entre "__method__" y "método"
- 22. Diferencia entre Mealy y Moore
- 23. Diferencia entre HashSet y HashMap?
- 24. diferencia entre ajax y enviar
- 25. Diferencia entre sistema y shell_exec
- 26. Diferencia entre Style y ControlTemplate
- 27. Diferencia entre relativo y absoluto
- 28. Diferencia entre window.location.href y top.location.href
- 29. Diferencia entre strncpy y memcpy?
- 30. diferencia entre SDL y GLUT
¿Quiere decir que en el caso del uso de la DynamicInvoke compilador produce más código IL para manejar la invocación de delegado? – testCoder
@testCoder no, usará la reflexión –
Gracias, explicación muy completa. – testCoder