Apuesto a que podría responderlo yo mismo si supiera más acerca de las herramientas para analizar cómo se comporta C # / JIT, pero como no lo sé, por favor tengan paciencia para preguntarme.
Tengo un código simple como este:
private SqlMetaData[] meta;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private SqlMetaData[] Meta
{
get
{
return this.meta;
}
}
Como puede ver, puse AggressiveInlining porque siento que debería estar en línea.
Yo creo que. No hay garantía de que el JIT lo alinee de otra manera. ¿Me equivoco?
¿Podría hacer este tipo de cosas dañar el rendimiento / estabilidad / algo?
c#
performance
meta-programming
Sarga
fuente
fuente
Respuestas:
Los compiladores son bestias inteligentes. Por lo general, exprimirán automáticamente tanto rendimiento como puedan desde cualquier lugar que puedan.
Tratar de ser más astuto que el compilador no suele hacer una gran diferencia, y tiene muchas posibilidades de ser contraproducente. Por ejemplo, la integración hace que su programa sea más grande ya que duplica el código en todas partes. Si su función se usa en muchos lugares en todo el código, en realidad podría ser perjudicial, como se señaló en @CodesInChaos. Si es obvio que la función debe estar en línea, puede apostar que el compilador lo hará.
En caso de duda, aún puede hacer ambas cosas y comparar si hay algún aumento de rendimiento, esa es la única forma segura de hacerlo ahora. Pero mi apuesta es que la diferencia será despreciable, el código fuente será "más ruidoso".
fuente
struct
s como parámetros, donde en muchos casos debería y podría. Además de perder cientos de optimizaciones obvias , que incluyen, entre otras, evitar verificaciones y asignaciones innecesarias de límites, entre otras cosas.Tiene razón: no hay forma de garantizar que el método esté en línea: MSDN MethodImplOptions Enumeration , SO MethodImplOptions.AggressiveInlining vs TargetedPatchingOptOut .
Los programadores son más inteligentes que un compilador, pero trabajamos en un nivel superior y nuestras optimizaciones son productos del trabajo de un hombre: el nuestro. Jitter ve lo que sucede durante la ejecución. Puede analizar tanto el flujo de ejecución como el código de acuerdo con el conocimiento aportado por sus diseñadores. Puede conocer mejor su programa, pero ellos conocen mejor el CLR. ¿Y quién será más correcto en sus optimizaciones? No lo sabemos con certeza.
Es por eso que debes probar cualquier optimización que hagas. Incluso si es muy simple. Y tenga en cuenta que el entorno puede cambiar y su optimización o desoptimización puede tener un resultado bastante inesperado.
fuente
EDITAR: Me doy cuenta de que mi respuesta no respondió exactamente la pregunta, aunque no hay una desventaja real, a partir de los resultados de mi tiempo tampoco hay una verdadera ventaja. La diferencia entre un captador de propiedades en línea es 0.002 segundos sobre 500 millones de iteraciones. Mi caso de prueba también puede no ser 100% exacto ya que está usando una estructura porque hay algunas advertencias sobre la inquietud y la alineación con las estructuras.
Como siempre, la única forma de saber realmente es escribir un examen y resolverlo. Aquí están mis resultados con la siguiente configuración:
Proyecto vacío con la siguiente configuración:
Resultados
Probado con este código:
fuente
Los compiladores hacen muchas optimizaciones. La inclusión es uno de ellos, ya sea que el programador lo quiera o no. Por ejemplo, MethodImplOptions no tiene una opción "en línea". Porque la compilación la realiza automáticamente el compilador si es necesario.
Muchas otras optimizaciones se realizan especialmente si se habilitan desde las opciones de compilación, o el modo "lanzamiento" lo hará. Pero estas optimizaciones son optimizaciones tipo "funcionó para usted, ¡excelente! No funcionó, déjelo" y generalmente ofrecen un mejor rendimiento.
es solo una señal para el compilador de que realmente se necesita una operación de alineación aquí. Más información aquí y aquí
Para responder tu pregunta;
Cierto. Sin garantía; Ninguno de los dos C # tiene una opción de "forzar en línea".
En este caso, no, como se dice al escribir aplicaciones administradas de alto rendimiento: un manual
fuente