.net - una - pasar funcion como parametro vb net
¿El uso de delegados ralentiza mis programas.NET? (4)
Solo una pequeña adición a la publicación de Jon: cuando se usa en la forma normal de C # (es decir, a través de lambdas / métodos anónimos / controladores de eventos / etc.), definitivamente son muy rápidos, pero tenga en cuenta que otro uso importante de delegados puede ser ejecutar código dinámico (ya sea métodos creados en tiempo de ejecución, o métodos existentes a través de reflection y Delegate.CreateDelegate). Cuando se utilizan de esta segunda manera, los delegados ofrecen una mejora de velocidad muy significativa (en comparación con Invoke de reflexión, etc.).
Así que no tengas miedo de usar delegados. Y, en particular, si tiene dudas, mida el código realista: no tiene sentido si se necesitan 1 o 100 microbandas *, si esto solo representa el 0,01% del tiempo total de ejecución.
* = solo una cantidad arbitrariamente pequeña de tiempo ...
¿El uso de delegados ralentiza mis programas?
Los he estado evitando porque realmente no tengo idea si hacen que mis programas sean más lentos. Sé que si provoco una excepción (catch), eso consume mucha potencia de la CPU, pero no sé sobre Delegados y Eventos y lo que .NET les hace.
Trabajo en Windows CE, por lo que este tipo de cosas a veces es un poco más pertinente. Por ejemplo, una aplicación descarada de la reflexión realmente puede doler, por lo que tendemos a evitar la reflexión cuando es razonable (obviamente, las aplicaciones pequeñas de la reflexión son buenas ). Obviamente no hago tal locura en el escritorio.
He escuchado a la gente murmurar acerca de los delegados y el rendimiento de CE, pero en lo que a mí respecta, es una burla total. Escuché que "ralentiza la llamada al método en un 30%", pero si eso es un 30% de un algoritmo de mierda, ¿de quién es la culpa? Otra ralentización en CE son los métodos virtuales, ya que no existe una tabla de búsqueda, los resuelve manualmente por primera vez y guarda el resultado en caché. Esto significa que si destruyes toda tu memoria, esos cachés se purgarán y se producirá un golpe de perforación la próxima vez. Pero eso considerado, ¿deberías descartar habilidades OOP útiles por el bien del rendimiento?
Me parece que muchos de estos "OMG no lo usan, es demasiado lento" son solo excusas. Principalmente, excusas porque la gente no sabe cuál es el problema con su aplicación y es fácil echarle la culpa al funcionamiento interno del CLR en lugar de a su propio código. Si tu rendimiento es malo, entonces creo que el 99.9% del tiempo puedes cambiar algo en tu parte de la aplicación o diseño que no arroje herramientas y produzca mejoras mucho mejores.
El rendimiento puede ser un tema delicado cuando se trata de programación. Por ejemplo, algunas personas son absolutamente inflexibles de que el boxeo es la raíz de todo mal. Otras personas piensan que los concats de cuerdas son un gran golpe de rendimiento.
En realidad, todo es relativo y todo se reduce a qué contexto estás hablando. Si está programando en un dispositivo móvil, querrá optimizar más que si estuviera trabajando en una aplicación de escritorio.
Por lo general, se reduce a una compensación entre el rendimiento y la elegancia del código. Digamos que has creado la base de códigos más maravillosamente elegante, fácil de mantener y comprensible del mundo. Tan pronto como arrojamos algunas optimizaciones de rendimiento comenzamos a nublar el código con algunas cosas posiblemente muy intuitivas y muy especializadas. Si vamos a la ciudad para optimizarlo, posiblemente podamos hacer un ahorro de rendimiento de, digamos, 5 o 10 por ciento, pero en el proceso destruiremos por completo la elegancia del código.
La pregunta es "¿Vale la pena?".
Si el rendimiento es absolutamente crítico para su proyecto, ejecute un generador de perfiles en su código. Si encuentra que el 90% del tiempo de su procesador es consumido por un método particularmente ineficiente, entonces ese método es un buen candidato para la optimización. Por lo general, no vale la pena perseguir los beneficios de bajo rendimiento a menos que esté trabajando en una aplicación de rendimiento crítico.
Los delegados son muy, muy rápidos. No tan rápido como las llamadas directas al método, pero no muy lejos. Las posibilidades de que se conviertan en un cuello de botella son minúsculas.
(Del mismo modo, las excepciones, cuando se usan correctamente, rara vez causan un problema de rendimiento ).
¿El uso de delegados haría su código más simple, más legible y más robusto? Si es así, úselos. Mida su desempeño cuidadosamente y manténgalo vigilado. Aléjese de la legibilidad solo por el rendimiento cuando los datos son claros.
Estoy seguro de que hay algunos gráficos que muestran la velocidad de los delegados frente a las interfaces frente a las llamadas a métodos no virtuales, etc. - No sé dónde están, pero siempre podría ejecutar las pruebas usted mismo si realmente está preocupado.