2009-03-16 11 views
8

Quiero saber esta información para reducir el tamaño de mi código, así no perderé mi tiempo para optimizar las cosas que harán el compilador o el JIT.¿A qué nivel el compilador de C# o JIT optimizan el código de la aplicación?

por ejemplo:

si asumimos la línea compilador de la llamada a la función get de una propiedad, así que no tengo que guardar el valor de retorno en una variable local para evitar llamada a la función.

Quiero recomendar una buena referencia que describa lo que está pasando?

Respuesta

18

Es posible que desee echar un vistazo a los siguientes artículos:

JIT Optimizations - (Sasha Goldshtein - CodeProject)
Jit Optimizations: Inlining I (David Notario)
Jit Optimizations: Inlining II (David Notario)

para ser honesto no debe preocuparse demasiado acerca de este nivel de micro-detalle. Deje que el compilador/JIT'er se preocupe por esto, es mejor que usted en casi todos los casos. No te cuelgues en Premature Optimisation.Céntrese en hacer que su código funcione, luego preocúpese por las optimizaciones más adelante si (a) no se ejecuta lo suficientemente rápido, (b) tiene problemas de "tamaño".

17

Si le preocupa el rendimiento, ejecute un generador de perfiles. Luego cambie el código. Lo más probable es que nunca, en un millón de años, adivinará el 100% de la ubicación correcta del tiempo. Podría estar cambiando el tiempo del 0.02% y dejando el método que contribuye con el 62% de la carga. También podrías estar empeorando las cosas. Sin un perfilador y evidencia, eres ciego.


No puede asumir que el JIT inline una propiedad de captador. Hay muchas razones por las que puede o no puede hacerlo; tamaño del cuerpo del método, virtual, valor vs tipo de referencia, arquitectura, depurador asociado, etc.

"elevación" todavía tiene un lugar, y todavía puede conseguir un ahorro si el código se llama repetidamente en un bucle estrecho; por ejemplo:

var count = list.Count; 
for(int i = 0 ; i < count ; i++) {...} 

(olvidar el debate for vs foreach fr lo anterior - esto es una discusión ortogonal). En lo anterior, el "polipasto" ayudará al rendimiento. Pero sólo para estar realmente confuso - con matrices, es todo lo contrario, y es más eficiente para no elevador que:

for(int i = 0 ; i < arr.Length ; i++) {...} 

El JIT lo reconoce y elimina la comprobación de límites (como matrices son fijos tamaño).

+0

¡No sabía nada de eso! Es bueno saberlo, gracias! – Groo

+0

Gracias por la información, pero estoy preguntando acerca de una buena referencia para esta información –

+2

Mi punto es que la referencia * no * realmente te ayudará con esto. Un ** profiler ** lo hará. –

1

Esto parece una especie de micro optimización que no debería estar mirando. Si no me equivoco, depende de la arquitectura y la versión del CLR que tipo de optimización se aplica.

Si su método se llama mucho, y usted realmente quiere que se alinee, puede hacerlo usted mismo a expensas del código de spaghetti.

Recomendaría analizar su algoritmo, para en línea un método no guardará las magnitudes de velocidad, mientras que un mejor algoritmo puede hacer que su tiempo de funcionamiento disminuya de horas a segundos.

-1

La optimización más potente realizada por un JIT generalmente está en línea. Un JIT puede incluso incluir cientos de funciones en profundidad (escuché esta cifra para JikesRVM). Incluso alinearán cosas que no siempre son posibles de alinear, y lo respaldarán más tarde si lo necesitan (lo que se denomina desoptimización dinámica).

Una buena descripción es http://java.sun.com/products/hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_4.html.

Para su pregunta específica, diría probablemente, si la llamada de función en cuestión es caliente.

Cuestiones relacionadas