¿Es importante que una solución sea eficiente?

9

Resuelvo muchos problemas, principalmente de Top Coder. Recibiré respuestas para muchos, pero la mayoría de las veces termino con una solución ineficiente.

En implementaciones del mundo real, ¿realmente importa que una solución al problema sea eficiente? Si es así, ¿cómo puedo mejorarlo?

Hormiga
fuente
44
¿Estás preguntando desde el punto de vista de un concurso o desde el punto de vista de implementaciones del mundo real?
rjzii
@RobZ: En implementaciones del mundo real
Ant
1
El "mundo real" cubre mucho terreno. ¿Incrustado? Aplicaciones de servidor? ¿Aplicaciones móviles? ¿Software de computadora personal para un solo usuario? Simulaciones científicas? Las respuestas no son necesariamente las mismas para ellos.
David Thornley

Respuestas:

34

La mejor solución es la que es (en orden de importancia creciente) eficiente, mantenible y realizada .

^^^ Eso es lo único que realmente necesita tomar de esta respuesta. ^^^

La eficiencia es importante . Tal vez un poco menos de lo que solía ser debido a nuestra abundancia de hardware, pero el rendimiento es una característica . En un concurso, la eficiencia es obviamente importante. Debe saber cómo escribir código eficiente. Más importante aún, debe conocer las mejores prácticas que producirán un código eficiente y de buen rendimiento sin sacrificar la puntualidad o facilidad de mantenimiento de una aplicación. Aquí es realmente donde la profundidad de la experiencia con una plataforma y un lenguaje arroja muchos rendimientos.

Sin embargo, lo más importante (en el 95% de los casos) es tener una solución completa y mantenible. Sin un producto terminado , no importa cuán eficiente o sostenible sea la solución. Si le lleva una cantidad extraordinaria de tiempo rastrear y corregir un error o agregar una nueva función, no importa cuán eficiente sea la solución. Pero, la eficiencia y el rendimiento son sin duda importantes, sin importar lo que alguien pueda decir.

Mike Cellini
fuente
3
Sip. Y un programa terriblemente ineficiente que es correcto y está hecho le brinda algo para probar sus mejoras.
Mike Sherrill 'Cat Recall'
1
La parte más importante de esto es conocer las mejores prácticas para la eficiencia, especialmente en el desarrollo de bases de datos, donde personalmente pondría la eficiencia por encima de la mantenibilidad. Los usuarios se preocupan desesperadamente por el rendimiento. A menudo he visto que se habla de un código más eficiente como más difícil de mantener, pero solo debido a que el desarrollador no comprende el código más eficiente, una vez que se familiariza con las técnicas, acude a esas técnicas como primera opción. y se vuelven más fáciles de mantener porque entiendes por qué funcionan.
HLGEM
@HLGEM Si hubo alguna parte de esta respuesta que quisiera reforzar como principio general (además de la primera línea), es conocer las mejores prácticas para escribir código eficiente. Y está en lo cierto con el comentario acerca de que el SQL eficiente es importante.
Mike Cellini
8

Estoy de acuerdo con Mike Cellini, lo único que agregaría es.

¿Es algo "suficientemente eficiente"? Por ejemplo, desde el punto de vista del usuario, no hay mucha diferencia entre una función que se completa en 0.00001 segundos o una que se completa en 0.1 segundos a pesar de que una es mucho más eficiente que la otra. Una función que se completa en 10 minutos no es muy diferente (para el usuario) a una función que se completa en 12 minutos. En ambos casos, el usuario tomaría una taza de café o continuaría con otra tarea.

He llegado a ver la eficiencia como "un usuario eficiente", no como un algoritmo eficiente.

Jaydee
fuente
La regla general que he escuchado es que un usuario puede notar una mejora del 20%. Ambos parecen calificar, creo que un usuario podría sentir una diferencia en la respuesta entre .1 y .00001 segundos.
Chris Pitman
Chris, puede que tengas razón en que un usuario podría notar la diferencia entre los dos sistemas uno al lado del otro, pero ¿un sistema haría al usuario notablemente más eficiente en su trabajo? Mi observación (he estado haciendo esto durante más de 25 años) es que los dos sistemas permitirían al usuario hacer la misma cantidad de trabajo en un momento dado.
Jaydee
2

En general, la solución más importante para un problema será la que realmente exista y sea válida para los casos tal como existen para su problema. En otras palabras, evite la optimización prematura hasta que sepa que tiene un código ineficiente o un código eficiente que debe ser más rápido.

Además, no olvide que la mejor solución para su aplicación puede no ser la solución de caso general. Caso y punto, hace un par de años, un profesor le dio a nuestra clase un problema en el que íbamos a imprimir los primeros 10 números de un tipo dado (lo siento, mi memoria me falla en cuanto al tipo, pero fue uno de los números más inusuales clases) y nos hicieron una prueba para verificar que el número fuera del tipo dado. Este fue el alcance del problema que se nos dio y se nos dijo que debía entregarse al día siguiente y que la solución más eficiente recibiría el crédito completo. En la siguiente conferencia, el profesor resumió los resultados:

  • Algunos estudiantes usaron un bucle simple y la fórmula provista para verificar que los números fueran correctos y los mostraran, despacio pero hicieron el trabajo, O (n ^ 3).
  • Otros estudiantes hicieron su investigación y encontraron una fórmula que hizo un mejor trabajo de verificación para asegurarse de que un número dado fuera válido, estos programas se ejecutaron mucho más rápido, O (n ^ 2).
  • Un estudiante usó la fórmula lenta para generar los valores y luego los copió en una matriz constante en su código y mostró el contenido de eso, O (n).

La solución final fue considerada la más eficiente por el profesor. Resulta que el problema era en realidad un ejercicio para comprender completamente el problema y no solo para salir y encontrar la solución más eficiente.

El punto de lo anterior es que cuando se trata de encontrar una solución eficiente a un problema, generalmente es mejor pasar el tiempo para asegurarse de que realmente comprende cuál es el problema antes de comenzar a escribir código o intentar optimizar el código. Si puede almacenar un conjunto de valores de referencia en una matriz constante, es mejor hacerlo desde el punto de vista del rendimiento que intentar escribir un algoritmo sofisticado.

Del mismo modo, no olvide que para la mayoría de las aplicaciones, las únicas personas que tienden a ver código ineficiente (¡cuando no es innecesariamente ineficiente!) Son los propios desarrolladores. Si escribe un código limpio que solo hace exactamente lo que debe hacer, lo más probable es que la mayoría de las veces los usuarios no noten problemas de rendimiento al trabajar con su programa y cuando simplemente optimizan las partes que mencionan tú.

rjzii
fuente
2

Eso depende de la estructura del concurso, pero en general, sí: el rendimiento es una consideración la mayor parte del tiempo, según su documentación . A veces, como en el enlace posterior, debes cazar, pero para citar:

Escriba código limpio, claro y eficiente. Si bien no existe una línea de pedido de revisión específicamente para esto, es probable que los revisores reaccionen mejor al código que es fácil de leer y comprender. Con un código eficiente, obtiene una ventaja potencial de rendimiento en pruebas de estrés y pruebas de referencia, así como también felicitaciones (y algunos puntos adicionales) de los revisores.

La mejor manera de mejorar en esto es escribir código que sea eficiente, lo que ya está haciendo. Incluso si completa el trabajo, dedique tiempo a mejorar su eficiencia, incluso después de la competencia, y eso dará sus frutos.

Probablemente también desee invertir en teoría, como libros sobre algoritmos , que pueden brindarle dos cosas: herramientas más eficientes para resolver un problema específico y mecanismos más eficientes para identificar cuál es el problema que debe resolver.

Finalmente, los cursos de informática están cada vez más disponibles en línea y cubrirán los antecedentes que necesita para mejorar.

Daniel Pittman
fuente
Hay una nueva edición del algoritmo de diseño manual. (11 años entre los dos). ¿Hay algo mal con el nuevo? Particularmente porque es más barato que el anterior. Si es así, tal vez eso debería abordarse en su respuesta.
Ingeniero mundial
No, acabo de enumerar el primero que encontré en Amazon, y no me molesté en comprobar que era la segunda edición.
Daniel Pittman
1

La eficacia de una solución debe depender de varios factores. Lo más importante es saber lo que quiere tu usuario. Aquí hay algunos ejemplos.

  1. Si usted es el único usuario de un bloque de código y funciona bien para usted, entonces probablemente esté bien.
  2. Si su programa se va a vender, entonces debe tener una plataforma objetivo en mente. Pruébalo con esta plataforma. Si el programa es excepcionalmente lento, debe trabajar para hacerlo más eficiente. Si le parece bien, entréguelo a otros usuarios y vea si están de acuerdo.
  3. Quizás el programa tiene otras consideraciones. Si está creando, por ejemplo, un programa basado en un servidor, entonces es posible que deba trabajar muy duro para que el programa sea lo más eficiente posible. O, si se ejecuta en un microprocesador, asegúrese de que funcione allí también.

Cómo hacer que su código sea más eficiente:

  1. El primer paso es tener una idea de lo que lleva más tiempo. El truco es hacer algo llamado código de perfil. Busque lo que lleva más tiempo y vea si puede encontrar una manera de hacerlo correr más rápido.
  2. Quizás el factor limitante clave es la memoria. Si ese es el caso, busque lo que está ocupando grandes cantidades de memoria y vea cómo podría reducirlo.

Hay un campo completo para la optimización, pero los dos consejos anteriores deberían al menos ayudarlo a comenzar.

PearsonArtPhoto
fuente
1

Para una competencia, debe comprender quiénes son los jueces y de qué se trata: si están buscando grandes programadores y nada más, obtendrán felicitaciones por un código más eficiente.

Como regla, en el mundo real, no importa. Una de las ideas clave del desarrollo de software es "No optimice lo que no sabe necesita optimización", luego "Optimice solo cuando se haya demostrado que es necesario"

Muchos practicantes argumentarán que esto conduce a un código hinchado e ineficiente que no se puede arreglar fácilmente, y en algunos casos extremos (de lo que se jactan como si eso fuera lo que la mayoría de los programadores hacen todo el día todos los días) son correctos. Sin embargo, no muchos proyectos de desarrollo de software tienen resultados medidos "Rendimiento: más rápido de lo necesario, costo: a quién le importa, tiempo de entrega: en algún momento de esta década", en el mundo real, generalmente es "lo quiero barato, lo quiero ayer, quiero a trabajar ".

Mattnz
fuente