Hay dos pasos para optimizar el código.
Primero, necesita saber qué es lento. Eso es perfilar, y, como es de suponer, un perfilador se utiliza comúnmente para esto. La mayoría de los perfiladores generalmente son fáciles de usar. Ejecuta su aplicación a través de un generador de perfiles, y cuando finaliza, el generador de perfiles le mostrará cuánto tiempo pasó en cada función, exclusiva (esta función sin contar el tiempo dedicado a la función invocada desde allí) e inclusive (tiempo empleado en este función, incluidas las llamadas a función infantil).
En otras palabras, obtienes un gran árbol de llamadas, y solo tienes que buscar los números grandes. Por lo general, tiene muy pocas funciones que consuman más del 10% del tiempo de ejecución. Así que ubique estos y sepa qué para optimizar.
Tenga en cuenta que un perfilador no es necesario ni, necesariamente, el mejor enfoque. Un enfoque notablemente simple, pero efectivo, es simplemente ejecutar el programa en un depurador y, en unos pocos tiempos casi aleatorios, detener la ejecución y observar la pila de llamadas. Haga esto solo un par de veces, y tiene una muy buena idea de dónde se está gastando su tiempo de ejecución. @Mike Dunlavey que comentó en esta respuesta ha descrito este enfoque en profundidad en otros lugares.
Pero ahora que sabe dónde se está gastando el tiempo de ejecución, entonces viene la parte difícil, cómo para optimizar el código.
Por supuesto, el enfoque más efectivo suele ser el de alto nivel. ¿El problema tiene que ser resuelto de esta manera? ¿Tiene que ser resuelto en absoluto?¿Pudo haber sido resuelto de antemano y el resultado almacenado en caché para que pudiera entregarse instantáneamente cuando el resto de la aplicación lo necesitara? ¿Hay algoritmos más eficientes para resolver el problema?
Si puede aplicar tales optimizaciones de alto nivel, hágalo, vea si eso mejoró el rendimiento lo suficiente, y si no, vuelva a generar el perfil.
Tarde o temprano, es posible que tenga que sumergirse en más optimizaciones de bajo nivel. Sin embargo, este es un territorio complicado. Las computadoras de hoy en día son bastante complejas y el rendimiento que obtiene de ellas no es directo. El costo de una rama o una llamada a una función puede variar ampliamente según el contexto. Agregar dos números juntos puede llevar de 0 a 100 ciclos de reloj dependiendo de si ambos valores ya estaban en los registros de la CPU, qué más se está ejecutando en ese momento, y un número de otros factores. Entonces la optimización en este nivel requiere (1) una buena comprensión de cómo funciona la CPU, y (2) mucha experimentación y mediciones. Puede hacer fácilmente un cambio que piensa será más rápido, pero debe estar seguro, así que mida el rendimiento antes y después del cambio.
Hay algunas reglas generales que a menudo pueden ayudar a optimizaciones de guía:
de E/S es caro. Las instrucciones de la CPU se miden en fracciones de un nanosegundo. El acceso a la RAM es del orden de decenas a cientos de nanosegundos. Un acceso al disco duro puede tomar decenas de mili segundos. Muy a menudo, la E/S será lo que está ralentizando su aplicación. ¿Su aplicación realiza pocas lecturas de E/S grandes (lea un archivo de 20 MB en una gran porción) o innumerables pequeñas (lea los bytes 2,052 a 2073 de un archivo y luego lea un par de bytes de otro archivo)? Menos lecturas grandes pueden acelerar su E/S en un factor de varios miles.
Los fallos de página también implican accesos al disco duro. Las páginas en memoria se deben insertar en el archivo de paginación, y las paginadas se deben volver a leer en la memoria. Si esto sucede mucho, va a ser lento. ¿Puedes mejorar la localidad de tus datos para que se necesiten menos páginas al mismo tiempo? ¿Puede simplemente comprar más RAM para la computadora host para evitar tener que sacar datos de la página? (Como regla general, el hardware es barato. Actualizar la computadora es una optimización perfectamente válida, pero asegúrese de que la actualización haga la diferencia. Las lecturas de discos no serán mucho más rápidas al comprar una computadora más rápida. Y si todo encaja en la RAM en su sistema anterior, no tiene sentido comprar uno con 8 veces más RAM)
Su base de datos también se basa en los accesos al disco duro. Entonces, ¿puede salirse con la tarea de almacenar en caché más datos en la memoria RAM y solo ocasionalmente escribirlos en la base de datos? (Por supuesto que hay un riesgo allí. ¿Qué sucede si la aplicación falla?
Y luego está todo el mundo favorito, enhebrado. Una CPU moderna tiene entre 2 y 16 núcleos de CPU disponibles. ¿Los está usando todos? usándolas? ¿Hay operaciones de ejecución prolongada que se pueden ejecutar de forma asíncrona? La aplicación inicia la operación en una secuencia separada, y luego puede reanudar la operación normal de forma instantánea, en lugar de bloquearla hasta que la operación se complete.
Así que básicamente , utilice el generador de perfiles para comprender su aplicación. ¿Cómo gasta su tiempo de ejecución, dónde se está gastando? ¿Es un problema el consumo de memoria? ¿Cuáles son los patrones de E/S (tanto en el disco duro y acceso a la red, así como cualquier otro tipo de E/S)? ¿La CPU está funcionando todo el tiempo o está inactiva esperando eventos externos, como E/S o temporizadores?
Y luego comprenda todo lo que pueda sobre la computadora en la que se está ejecutando. Comprenda qué recursos tiene disponible (caché de CPU, núcleos múltiples) y qué significa cada uno de ellos para el rendimiento.
Todo esto es bastante vago, porque los trucos para optimizar un gran servidor de base de datos van a ser muy diferente de lo que haría para optimizar algún gran algoritmo de reducción de número.
Juega con los perfiladores si quieres, pero para resolver el problema, haz lo siguiente: http://stackoverflow.com/questions/550109/what-are-some-resources-i-can-use-to-learn- profiling-optimizing/575417 # 575417 –