2009-02-12 9 views
7

Cuando dice que este código necesita alguna optimización, o puede ser de alguna manera optimizado, ¿qué significa eso? qué tipo de código necesita optimización? ¿Cómo aplicar la optimización al código en C#? ¿Cuáles son los beneficios de eso?¿Qué es la optimización de código?

Respuesta

15

Optimización es un término muy amplio. En general, implica modificar el sistema para que algunos de sus aspectos funcionen de manera más eficiente o utilicen menos recursos o sean más sólidos. Por ejemplo, un programa de computadora puede ser optimizado para que se ejecute más rápido o use menos memoria o almacenamiento en disco o sea más receptivo en términos de UI.

Aunque la "optimización" tiene la misma raíz que "óptima", el proceso de optimización no produce un sistema totalmente óptimo: siempre hay una compensación, por lo que solo se optimizan los atributos de mayor interés.

Y recuerda:

La primera regla de la optimización del Programa: No practico. La segunda regla de optimización del programa (¡solo para expertos!): No lo hagas aún. (Michael A. Jackson)

+3

+1, pero odio esa cita de Jackson. Básicamente se trata de rezar para que haya diseñado un sistema de rendimiento, y si no, diferir las correcciones necesarias hasta el último momento posible. IMO, una receta para el desastre. Simplemente diría que entienden sus requisitos de perforación y se desarrollan en consecuencia. –

+1

Prefiero la cita de Donald Knuth, "Deberíamos olvidarnos de las pequeñas eficiencias, digamos el 97% del tiempo: la optimización prematura es la raíz de todo mal. Sin embargo, no deberíamos dejar pasar nuestras oportunidades en ese crítico 3%". Ese crítico 3% es una parte particularmente importante (y a menudo ignorada) de esta cita. Es la fruta baja que cuelga. Algunas veces, los mejores pagos pueden realizarse con un mínimo esfuerzo. Solo tiene que pasar un poco de tiempo midiendo y analizando para encontrar esos cuellos de botella. –

-3

Podría ser por ejemplo que el código tiene un bloque de código que está duplicado, y podría/debería ponerse en un método, puede que esté utilizando métodos/clases en desuso, podría haber formas más simples de hacer lo que el código está haciendo, puede haber algo de limpieza para hacer (por ejemplo, eliminar la codificación rígida), etc.

+0

Creo que se llama refactorización. No es exactamente lo mismo. –

3

La optimización de código hace que el código se ejecute más rápido. Hay dos formas principales de hacerlo:

1) Exprimir más trabajo en menos ciclos. Averiguar dónde el código está haciendo una copia adicional o si hay una rama en un círculo cerrado. Esto se está optimizando en lo pequeño.

2) Haciendo que sus algoritmos escalen mejor. Es posible que haya escuchado sobre la notación de "Big O". Esto hace que un algoritmo se degrade mucho menos rápidamente con grandes conjuntos de datos.

Por ejemplo, si busca ingenuamente una guía telefónica para un nombre, comenzará en la página 1 y leerá todos los nombres hasta que encuentre la que está buscando. Esto tomará una serie de instrucciones a escala según la cantidad de nombres en la guía telefónica. Llamamos a esto O (n). Ahora piensa en cómo realmente buscas en la guía telefónica. Se abre en algún lugar hacia el medio y ve de qué lado está el nombre que está buscando. Esto se denomina búsqueda binaria y escala al logaritmo del número de nombres. Llamamos a esto O (logn). Es mucho más rápido.

Recuerde la primera regla de optimización: Mida primero. Se han gastado muchos años en la optimización del código que no se ejecutó mucho.

+0

Ampliaría "funciona más rápido" para "consume menos recursos". – peterchen

+0

Esto es útil, pero se agradecería más explicación De directorio telefónico, supongamos que tengo miles de nombres y cada nombre tiene uno o más teléfonos, al buscar cada nombre con todos sus teléfonos, debe buscar cada nombre y elegir su teléfono. Dónde optimizar aquí Cómo aplicar Big O. –

+0

Tiendo a estar de acuerdo con Peter Chen en que el principal recurso que se agota actualmente no son los ciclos de CPU. IMO es el ancho de banda de la red, de ahí todo el esfuerzo para optimizar los códecs AV, etc. –

5

Optimization es el proceso de modificar un sistema para que algunos aspectos de él funcionen de manera más eficiente o utilicen menos recursos.

En su caso se refiere principalmente a 2 niveles:

Grado de proyecto

Al más alto nivel, el diseño puede ser optimizado para hacer el mejor uso de los recursos disponibles. La implementación de este diseño se beneficiará de una buena selección de algoritmos eficientes y la implementación de estos algoritmos se beneficiará al escribir código de buena calidad. El diseño arquitectónico de un sistema afecta abrumadoramente su rendimiento.La elección del algoritmo afecta la eficiencia más que cualquier otro elemento del diseño. En algunos casos, sin embargo, la optimización se basa en el uso de algoritmos más sofisticados, haciendo uso de casos especiales y trucos especiales y realizando complejas compensaciones; por lo tanto, un programa totalmente optimizado puede a veces, si no se comenta lo suficiente, ser más difícil de comprender para los programadores menos experimentados y, por lo tanto, puede contener más fallas que las versiones no optimizadas.

nivel de código fuente

Evitar la codificación de mala calidad también puede mejorar el rendimiento, evitando retrasos evidentes. Después de eso, sin embargo, son posibles algunas optimizaciones que realmente disminuyen la capacidad de mantenimiento; algunos, pero no todos, hoy en día se pueden realizar optimizando compiladores. Por ejemplo, usar más indirección a menudo se necesita para simplificar o mejorar un software, pero esa indirección tiene un costo.

1

Para agregar a la respuesta de Anton Gogolev, cuando una pieza de código necesita optimización, se debe a que no se cumple un requisito de rendimiento particular. Desarrollamos programas para cumplir con los requisitos de los usuarios, ¿verdad? La mayoría de los programadores tienden a pensar en términos de requisitos funcionales, es decir, qué hace el programa, pero los usuarios también tienen requisitos de rendimiento, cuál es el costo del recurso (ancho de banda de red, ciclos de CPU, memoria, espacio en disco, etc.) de proporcionar la funcionalidad. La optimización es el proceso de cambiar una pieza de código para cumplir con un requisito de rendimiento específico. En mi humilde opinión, esto debería ocurrir en el momento del diseño, pero a veces escribirás un fragmento de código solo para descubrir que tiene un rendimiento inferior. Para optimizar el código, primero debe averiguar cuál es el recurso que está usando. Si se trata de ciclos de CPU o memoria, un generador de perfiles podría ayudar. Si se trata de ancho de banda de red, que es muy común en estos días, deberá realizar algunas pruebas de carga y perfiles de comunicación.

Mi consejo sería entender siempre sus requisitos actuales y probables de rendimiento futuro antes de escribir el código, y optimizar en la etapa de diseño. La optimización tardía es costosa, difícil y, a menudo, falla o produce un código desagradable.

1

optimización tiene dos propósitos principales:

  • conseguir su uso de software de menos recursos, por ejemplo, correr más rápido, ser más pequeño, usar menos memoria RAM, espacio en disco duro de menos tanto cuando se ejecuta o almacenamiento de documentos, menos la red acceso, ...

  • haciendo que su software sea más fácil de mantener, refabrándolo.

No es necesario para optimizar el tiempo que ninguna cuestión relacionada se ha planteado: Es mucho más difícil de código optimizado de depuración de optimizar el código correcto.

3

Al hacer la optimización del código, usted toma una medida en su código y trata de hacerlo más eficiente. La métrica generalmente se refiere a un recurso escaso.

Éstos son mediciones comunes

  • Velocidad de ejecución (por lo general el primero que viene a la mente al decir optimización)
  • El consumo de memoria
  • tamaño del ejecutable (en sistemas embebidos puede ser importante)
  • Acceso a la base de datos
  • Acceso a servicio remoto (Haz que sea menos hablador, almacenando en caché ...)
  • simplicidad, legibilidad, mantenibilidad del código

Después de la optimización del código debe dar el mismo resultado.

El problema es que debe tomar decisiones. La velocidad de ejecución a menudo viene con más consumo de memoria ...

También debería considerar la optimización global. Tener una ganancia de 10ms en un bucle cuando pasas 1000ms esperando un servicio web es totalmente inútil.

Cuestiones relacionadas