¿Para qué optimizas? [cerrado]


19

En términos generales, ¿hacia qué tipo de optimizaciones se inclina generalmente cuando diseña software?

¿Eres del tipo que prefiere optimizar tu diseño para

  • ¿Tiempo de desarrollo (es decir, rápido de escribir y / o más fácil de mantener)?
  • Tiempo de procesamiento
  • Espacio de almacenamiento (ya sea RAM, DB, disco, etc.)

Por supuesto, esto es muy subjetivo para el tipo de problemas que se resuelven y los plazos involucrados, por lo que me gustaría saber sobre las razones que lo harían elegir una forma de optimización sobre otra.


Los tres anteriores, pero quiero incluir en general (que se refiere al mantenimiento). Cuando se toma su tiempo para diseñar una estructura de datos realmente eficiente ampliamente aplicable a las necesidades de su software, por ejemplo, y probarla exhaustivamente, le servirá durante años y le impedirá tener que escribir muchas más estructuras de datos adaptadas estrechamente a la resolución individual problemas.

Respuestas:


40

Mantenimiento

Luego perfile si es necesario y optimice la velocidad. Raramente he tenido necesidad de almacenamiento, al menos no en los últimos 10 años. Antes de eso lo hice.


8
+1, si optimiza la mantenibilidad para comenzar, entonces será más fácil optimizar la velocidad o el almacenamiento más adelante si resulta necesario.
Carson63000

Todavía necesita al menos considerar el tiempo de procesamiento y el almacenamiento para no elegir un enfoque extremadamente excesivo.

@ Thorbjørn, si está optimizando el tiempo de desarrollador, probablemente (más que probable) elija los algoritmos que son más fáciles de leer / escribir en un idioma determinado. Solo más tarde, y solo si el rendimiento se convierte en un problema, ambos podrían (como lo dijo @Tim) elegir un generador de perfiles.
Jason Whitehorn el

@ Jason, estoy totalmente en desacuerdo. Debe estar familiarizado con las características de rendimiento de los algoritmos que elija para poder elegir una implementación adecuada. Es decir, elegir una ArrayList cuando la necesita principalmente para buscar códigos postales podría no escalar bien.

1
@ Thorbjørn, no estoy en desacuerdo contigo. De hecho, creo que tiene razón en que se debe prestar atención a los algoritmos disponibles. Sin embargo, creo que donde diferimos en las opiniones es que, en mi opinión, la idea de qué algoritmos elegir es algo aprendido a través de la experiencia, y se soluciona solo cuando se presenta un problema. Tienes razón en tu punto, simplemente no veo la necesidad de optimizarlo a expensas de que sea menos legible / más largo implementar el código.
Jason Whitehorn el

27

Tiempo de desarrollo

El procesamiento y el almacenamiento son baratos. Tu tiempo no es

Solo para notar:

Esto no significa hacer un mal trabajo al escribir código solo para terminarlo rápidamente. Significa escribir el código de una manera que facilite el desarrollo rápido. También depende completamente de sus casos de uso. Si se trata de un sitio web simple de dos o tres páginas con un formulario de contacto, probablemente no necesite usar un marco PHP. Un par de incluye y una secuencia de comandos de correo acelerará el desarrollo. Si, en cambio, el plan es crear una plataforma flexible en la que crecer y agregar nuevas características, vale la pena tomarse el tiempo para diseñarla correctamente y codificar en consecuencia, ya que acelerará el desarrollo futuro.

En la comparación directa con el tiempo de procesamiento y el almacenamiento, me inclino hacia un tiempo de desarrollo más rápido. ¿El uso de la función de sustracción collectionutils es el método más rápido y eficiente en cuanto a memoria para restar colecciones? ¡No! Pero es un tiempo de desarrollo más rápido. Si se encuentra con cuellos de botella en el rendimiento o la memoria, puede resolverlos más adelante. Optimizar antes de saber qué necesita ser optimizado es una pérdida de tiempo y eso es lo que estoy defendiendo.


44
La ley de Moore terminó hace unos dos años. Tal vez sea hora de comenzar a pensar en la concurrencia y usar esos núcleos adicionales. Esa es la única forma en que obtendrá ciclos de reloj baratos en el futuro.
Robert Harvey, el

3
Para ser correcto, la ley de Moore todavía se está fortaleciendo con una duplicación del número de transistores en un chip aproximadamente cada 2 años, que es lo que permite la colocación de múltiples núcleos en un solo dado. Lo que ha terminado es el "almuerzo gratis" de un número cada vez mayor de ciclos por segundo.
Dominique McDonnell el

1
"El procesamiento y el almacenamiento son baratos". La memoria caché de la CPU y la velocidad del bus no lo son. Son los principales cuellos de botella de rendimiento en la actualidad.
mojuba el

3
Estoy completamente de acuerdo con esto. Mantener el código legible, usar las herramientas apropiadas para la tarea y cumplir con los estándares acordados de su empresa reducirá significativamente el tiempo que dedica a escribir código en una computadora, lo que le ahorrará a su empresa un montón de dinero. Su tiempo se gasta mejor en ingeniería que en escribir.
Matt DiTrolio el

1
@Bill: O si lo hace incrustado, donde puede tener límites duros que aumentarán significativamente el costo del producto si los supera. O, a veces, para el software del servidor: si alguien pudiera mejorar el procesamiento en los servidores de Google en un 1%, eso sería un ahorro considerable.
David Thornley el

12

Experiencia de usuario.

Este es el único valor que le importa a su cliente.

El tiempo de desarrollo es menos importante. Puedo escribir una aplicación de línea de comandos con todas las funciones mucho más rápido que una GUI, pero si la Sra. Jane no puede encontrar la forma de escupir los informes que quiere, es inútil.

El mantenimiento es menos importante. Puedo reparar un balancín muy rápido, pero si está en medio de un bosque, los usuarios no pueden encontrarlo.

El tiempo de procesamiento es menos importante. Si hago un automóvil que va 0 a la velocidad de la luz en 60 segundos, los usuarios no pueden conducir.

La estética es menos importante. Puedo pintar una Mona Lisa, pero si está escondida detrás de una pared, nadie podrá verla.

La experiencia del usuario es el único valor que importa. Hacer una aplicación que haga exactamente lo que el usuario quiere de la manera que el usuario espera es el logro final.


Lo siento, Joeri, me dejé llevar por mi edición.
Malfist

Es una wiki comunitaria para algo, ¿verdad? ;)
Joeri Sebrechts

8

Solo hay una cosa para optimizar y es:

Lo que quieren tus clientes

¿Sus clientes necesitan el programa más rápido posible? Optimizar para la velocidad.

¿Sus clientes necesitan una fiabilidad absoluta? Optimizar para eso.

¿Lo necesitan entregado mañana o será inútil? Optimizar para la velocidad de desarrollo.

¿Funciona en un dispositivo increíblemente pequeño con recursos limitados? Optimizar para esos recursos.


El único inconveniente es que a menudo no saben lo que quieren o tienen expectativas sobre lo que es posible o útil.
Tim Williscroft el

1
Y cuando se le hace esa serie de preguntas de opción múltiple, con frecuencia simplemente escuchará "sí" :-)
Jason Whitehorn

1
No dije que fuera fácil. Y al menos si lo preguntas, existe la posibilidad de que obtengas una respuesta útil.
DJClayworth

5

Tiempo de procesamiento

El tiempo de mi usuario no es barato. Lo que viene, gira.


Acabo de actualizar una aplicación que uso este año pasado. Habían reescrito completamente la aplicación, y vaya que era lenta. Finalmente tuve que comprar una computadora nueva para ejecutarla rápidamente. Te garantizo que no fue barato, pero mi tiempo es más valioso.


Interesante toma en el tiempo de procesamiento inclinado. ¿Le gustaría compartir qué tipo de aplicaciones desarrolla? Estoy intrigado.
Jason Whitehorn el

1
El tiempo de procesamiento es importante si se ejecuta en muchas computadoras. Por ejemplo, si es una opción entre pasar 2 meses adicionales optimizando o actualizar 10,000 PC a un hardware más nuevo, en ese caso el tiempo del desarrollador no gana. Pero, por supuesto, es un compromiso. Si solo ejecuta en media docena de servidores, el tiempo del desarrollador probablemente gane en ese caso.
Dean Harding, el

1
@ Jason, ahora lo tengo fácil, trabajando con Excel y VBA en un conglomerado de hojas de cálculo (que he estado condensando rápidamente). Mis usuarios trabajan en la sala de al lado y me avisan si tengo algún problema. Mi perspectiva proviene del uso de computadoras durante treinta años, y ver cómo las aplicaciones se siguen hinchando, lo que obliga a las actualizaciones a compensar demasiado. Sé que los desarrolladores pueden hacerlo mejor, solo tienen que acostumbrarse a escribir código eficiente.

+10 para el código eficiente. Eso se pasa por alto con demasiada frecuencia, especialmente en programación modular. Cada módulo funciona a una velocidad razonable, pero la suma de todos puede ser terriblemente lenta.
Joris Meys el

4

Tiendo a inclinarme hacia la limitación del consumo de memoria y las asignaciones. Sé que es de la vieja escuela, pero:

  • La mayor parte del código no desechable que escribo es muy paralelo. Esto significa que la asignación excesiva de memoria y la actividad de recolección de basura serializarán una gran cantidad de código paralelo. También significa que habrá mucha contención para un bus de memoria compartida.
  • Mi idioma principal es el D, que todavía no tiene un buen soporte de 64 bits (aunque esto se está solucionando).
  • Trabajo regularmente con conjuntos de datos bastante grandes.

+1 por trabajar para prevenir el bloatware. Los programas que acaparan la memoria son malos programas.

Los programas de acaparamiento de memoria se pueden ejecutar en sistemas de 64 bits, en general. Eso es lo que hicimos cuando una de nuestras aplicaciones tuvo problemas de memoria (legítimamente usa grandes cantidades de memoria). El primer punto es importante cuando lo es el rendimiento.
David Thornley el

2

Diría que optimizo hacia la eficiencia, y la eficiencia se define como un compromiso entre el tiempo de desarrollo, el mantenimiento futuro, la experiencia del usuario y los recursos consumidos. Como desarrollador, necesita hacer malabarismos con todo esto para mantener algún tipo de equilibrio.

¿Cómo logras ese equilibrio? Bueno, primero debe establecer algunas constantes, como cuál es la fecha límite, en qué hardware se ejecutará su aplicación y qué tipo de persona la usará. Sin saber esto, no puede establecer el equilibrio correcto y priorizar dónde se necesita.

Por ejemplo, si está desarrollando una aplicación de servidor en una máquina poderosa, es posible que desee cambiar la eficiencia del rendimiento para asegurarse de cumplir con una fecha límite inamovible. Sin embargo, si su desarrollador tiene una aplicación que necesita responder rápidamente a la entrada del usuario (piense en un videojuego), entonces debe priorizar su rutina de entrada para asegurarse de que no sea lenta.


2

Cualquier tecnología de virtualización que esté usando

¿Recuerdas los días en que los sistemas con más de 512 MB de RAM se consideraban de última generación? Me paso los días escribiendo código para el anterior.

Trabajo principalmente en programas de bajo nivel que se ejecutan en el dominio privilegiado en un entorno Xen. Nuestro límite máximo para el dominio privilegiado es de 512 MB, dejando el resto de la RAM libre para que nuestros clientes la utilicen. También es típico que limitemos el dominio privilegiado a un solo núcleo de CPU.

Así que aquí estoy, escribiendo código que se ejecutará en un nuevo servidor de $ 6k, y cada programa tiene que funcionar (idealmente) dentro de un límite máximo asignado de 100kb, o evitar completamente la asignación de memoria dinámica.

De manera concisa, optimizo para:

  • Huella de memoria
  • Ordena (donde la mayor parte de mi código pasa la mayor parte del tiempo)

También tengo que ser extremadamente diligente cuando se trata de pasar tiempo esperando cerraduras, esperando E / S o simplemente esperando en general. Una gran parte de mi tiempo se destina a mejorar las bibliotecas de sockets no bloqueantes existentes y a buscar métodos más prácticos de programación sin bloqueo.

Todos los días me parece un poco irónico que esté escribiendo un código tal como lo hice hace 15 años, en sistemas que se compraron el mes pasado, debido a los avances tecnológicos.

Esto también es típico para cualquiera que trabaje en plataformas integradas, aunque incluso muchos de ellos tienen al menos 1 GB a su disposición. Como Jason señala, también es típico cuando se escriben programas para ejecutarse en dispositivos móviles. La lista continúa, quioscos, clientes ligeros, marcos de cuadros, etc.

Estoy empezando a pensar que las restricciones de hardware realmente separan a los programadores de las personas que pueden hacer que algo funcione sin importar lo que realmente consuma. Me preocupa (si es necesario, vóteme) qué lenguajes que resumen completamente el tipo y la comprobación de memoria al conjunto colectivo de sentido común que (solía) compartirse entre programadores de diversas disciplinas.


1
+1 para el ángulo de impresión del pie de memoria. Nunca he codificado las restricciones particulares con las que está lidiando, pero elimine la primera sección que habla sobre Xen y reemplácela con iPhone y sé exactamente de dónde viene :-)
Jason Whitehorn

2

Resultados de la investigacion

Como académico, pensé que debería compartir lo que optimizo. Tenga en cuenta que esto no es lo mismo que optimizar para un tiempo de desarrollo más corto. A menudo significa que el trabajo podría respaldar algunas preguntas de investigación, pero no ser un producto entregado y pulido. Esto podría verse como un problema con la calidad, y podría explicar por qué muchos dicen que los informáticos (académicos) no tienen ninguna experiencia del "mundo real". (Por ejemplo, "¿No sabrían cómo desarrollar un producto entregable de otra manera?" )

Es una línea muy fina. En términos de impacto, desea que su trabajo sea utilizado y citado por otros, y el efecto Iceberg de Joel entra en juego: un poco de brillo y brillo puede ser muy útil. Pero si no está haciendo una base para otros proyectos sobre los que se pueda construir, es posible que no pueda justificar el tiempo dedicado a hacer un producto entregable.


1
  1. Diseño
    • bajo acoplamiento, modular
    • áreas concisas, bien definidas y funcionales
    • bien documentada
    • Refactorización continua para cruft
  2. Mantenimiento
    • construcción y depuración reproducibles
    • pruebas unitarias
    • pruebas de regresión
    • fuente de control

... después de eso todo lo demás

... finalmente, optimiza el rendimiento ;-)


1

Calidad / Pruebas

Optimice hacia la calidad, como para garantizar que haya tiempo en el cronograma de desarrollo para las pruebas, tanto las pruebas unitarias como las pruebas después de las características / fases.


1

Depende de la necesidad de su programa.

La mayor parte de lo que hago está fuertemente limitado por la capacidad de procesamiento y la memoria, pero no pasa por muchos, si es que hay alguno, cambios significativos en el año promedio.

En el pasado he trabajado en proyectos donde el código se cambia con frecuencia, por lo que la mantenibilidad se vuelve más importante en esos casos.

También he trabajado en sistemas en el pasado donde la cantidad de datos es el problema más importante, incluso en el disco para el almacenamiento, pero más comúnmente el tamaño se convierte en un problema cuando tienes que mover los datos mucho o demasiado lento enlace.


1

Elegancia .

Si su código está bien diseñado, tendrá varios efectos:

  1. Será más fácil de mantener (reducir los costos para el cliente)
  2. Será más fácil de optimizar (para JIT o compiladores completos)
  3. Será más fácil de reemplazar (cuando piense en una mejor solución)


0

Como realizo instalaciones en varios tipos de sistemas, desde mainframe de IBM hasta PC, primero optimizo la compatibilidad, luego el tamaño y luego la velocidad.


0

Depende

Si está trabajando en un sistema de procesamiento de video incorporado en tiempo real, entonces optimiza la velocidad de procesamiento. Si está trabajando en un procesador de textos, optimiza el tiempo de desarrollo.

Sin embargo, en todos los casos su código debe funcionar y debe ser mantenible.


0

Expresividad de mi intento.

Quiero que alguien que lea mi código pueda ver fácilmente qué operaciones estaba intentando invocar en el dominio. Del mismo modo, trato de minimizar la basura no semántica (llaves, palabras clave de 'función' en js, etc.) para facilitar el escaneo.

Por supuesto, tienes que equilibrar eso por mantenibilidad. Me encanta escribir funciones que devuelven funciones y todo tipo de técnicas avanzadas y HACEN aún más mi objetivo, pero si el beneficio es leve, me equivocaré al apegarme a las técnicas con las que los programadores sólidos de jr estarían familiarizados.


-6

Todos ellos

Tiempo de procesamiento

Las computadoras de hoy son rápidas, pero lejos de lo que es suficiente. Hay muchas situaciones en las que el rendimiento es crítico, si haces servidores de transmisión de medios.

Almacenamiento

Su cliente podría tener un disco grande, digamos, 1Tb. ¿Qué puede ocupar 1000 películas en HD? Si quieres que sea un servicio, está lejos de ser suficiente, ¿no?

Tiempo de desarrollo

Bueno, no estoy seguro de si esto cuenta como "optimización", lo que hago es usar Java en lugar de C ++, y el desarrollo es 10 veces más rápido. Siento que estoy diciendo lo que pienso directamente a la computadora, muy directamente adelante y totalmente rocas!

Por cierto, creo que para acelerar el desarrollo de su proceso de desarrollo, debe elegir Java, nunca intente basura como Python ... lo que afirma que pueden acortar el tiempo de desarrollo.


Puede que esta lectura le resulte interesante: paulgraham.com/avg.html : analiza la fuerza de los lenguajes de programación.

3
Con tiempo y presupuesto limitados, no puede dedicar tiempo a todos ellos; debe haber alguna prioridad.
JBRWilkinson

@JRBWilkinson Bueno, debería ser caso por caso
tacto
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.