¿Los algoritmos (y la eficiencia en general) se vuelven menos importantes?

29

Dado que comprar potencia de cálculo es mucho más económico que en el pasado, ¿el conocimiento de algoritmos y la eficiencia son cada vez menos importantes? Está claro que querrás evitar un bucle infinito, por lo tanto, no todo funciona. Pero si tiene un mejor hardware, ¿podría tener un software peor?

Quora Feans
fuente
2
"ambos sí y no"!
vzn
44
Ahora que los aviones existen, y la carga transatlántica ya no tiene que irse en barco, ¿es menos importante la velocidad de envío? Los clientes de FedEx y DHL no lo creen así.
Peter Shor
2
Si el tamaño de la entrada es lo suficientemente grande, una diferencia de orden de magnitud entre los algoritmos es importante, no importa cuán rápido sea la máquina. Pero ocasionalmente me dejo engañar para hacer cambios para "optimizar" una diferencia de factor constante solo para darme cuenta de que el uso de expresiones integradas en el azúcar sintáctico del lenguaje de programación <cough> Python </cough> es significativamente más rápido que mi "optimización".
kojiro
véase también la Ley de Moore
VZN
Un caso de estudio interesante aquí es, por ejemplo, Windows, que en algunos / muchos aspectos se ejecuta de manera menos eficiente incluso en hardware altamente optimizado de lo que solía ... al igual que la ley de Moores está mejorando el hardware, parece haber una ley inflacionaria correspondiente en el software en el que el software moderno está haciendo más y más todo el tiempo, con nuevas capas agregadas y multiplicándose ... algo análogo a la forma en que un gas llena todo el volumen disponible ... o en el que un presupuesto no importa cuán grande o creciente siempre se agota o algo invadido ... ver también carrera evolutiva
vzn

Respuestas:

31

Realmente me gusta el ejemplo del libro Introducción a los algoritmos , que ilustra la importancia de la eficiencia del algoritmo:

Comparemos dos algoritmos de clasificación: clasificación por inserción y clasificación por fusión . Su complejidad es y O ( n log n ) = c 2 n lg n respectivamente. Normalmente, la ordenación de fusión tiene un factor constante más grande, así que supongamos que c 1 < c 2 .O(norte2)=do1norte2O(norteIniciar sesiónnorte)=do2nortelgnortedo1<do2

Para responder a su pregunta, evaluamos el tiempo de ejecución de una computadora más rápida (A) que ejecuta un algoritmo de clasificación de inserción contra una computadora más lenta (B) que ejecuta un algoritmo de clasificación de fusión.

Asumimos:

  • el tamaño del problema de entrada es de 10 millones de números: ;norte=107 7
  • la computadora A ejecuta instrucciones por segundo (~ 10GHz);1010
  • la computadora B ejecuta solo instrucciones por segundo (~ 10MHz);107 7
  • los factores constantes son (lo que está ligeramente sobreestimado) y c 2 = 50 (en realidad es más pequeño).c1=2c2=50

Así que con estos supuestos se necesita

para que la computadora A clasifique107números y

2(107)2 instructions1010 instructions/second=2104 seconds
107

50107 7lg107 7 instrucciones107 7 instrucciones/ /segundo1163 segundos

para la computadora B.

Entonces, la computadora, que es 1000 veces más lenta, puede resolver el problema 17 veces más rápido. En realidad, la ventaja del tipo de fusión será aún más significativa y aumentará con el tamaño del problema. Espero que este ejemplo te ayude a responder tu pregunta.

Sin embargo, esto no se trata solo de la complejidad del algoritmo. Hoy en día es casi imposible obtener una aceleración significativa simplemente con el uso de la máquina con una frecuencia de CPU más alta. Las personas necesitan diseñar algoritmos para sistemas de múltiples núcleos que escalen bien. Esta también es una tarea difícil, porque con el aumento de núcleos, también aumenta una sobrecarga (por ejemplo, para administrar los accesos a la memoria). Por lo tanto, es casi imposible obtener una aceleración lineal.

En resumen, el diseño de algoritmos eficientes hoy en día es tan importante como antes, porque ni el aumento de frecuencia ni los núcleos adicionales le darán la aceleración en comparación con el algoritmo eficiente.

Pavel Zaichenkov
fuente
44
Vale la pena mencionar que la imposibilidad de la aceleración lineal se deriva de la ley de Amdhal .
Bartosz Przybylski
La ley de Amdhal no siempre es aplicable. Abundan los problemas en la ciencia computacional donde la fracción de trabajo no paralelo se reduce a cero a medida que aumenta el tamaño del problema. Digamos que calcular requiere n 2 de trabajo y necesita calcular n i = 1 f ( x i ) para n diferentes x i s . En serie, el costo de tiempo es O ( n n 2 + n ) = O ( n 3 )F(X)norte2yo=1norteF(Xyo)norteXyosO(nortenorte2+norte)=O(norte3), mientras que en paralelo con procesadores, el trabajo es O ( n 2 + n ) = O ( n 2 ) . norteO(norte2+norte)=O(norte2)
Nick Alger
"Por lo tanto, la computadora, que es 1000 veces más lenta, puede resolver el problema 17 veces más rápido". Esta es una afirmación falsa ya que combina la velocidad del hardware y diferentes algoritmos al mismo tiempo. En su lugar, compare la computadora A con la computadora B para cada tipo de clasificación por separado. (¿Por qué no puedo utilizar la combinación de una especie en el equipo A o inserciones tipo en el equipo B?)
AquaAlex
3
@AquaAlex, el propósito del ejemplo es mostrar que la computadora lenta puede superar a la rápida solo por medio del algoritmo seleccionado. Podríamos comparar el tiempo de ejecución para cada tipo de clasificación por separado o ejecutar la clasificación de fusión en A y la clasificación de inserciones en B. Pero mostrar que una computadora más rápida generalmente funciona mejor que una lenta simplemente no tiene sentido.
Pavel Zaichenkov
De acuerdo, la idea era mostrar que un algoritmo más eficiente aún tiene peso incluso en el día en CPU más rápidas y memoria más grande.
AquaAlex
36

De lo contrario. Al mismo tiempo que el hardware se está volviendo más barato, se producen varios otros desarrollos.

Primero, la cantidad de datos a procesar está creciendo exponencialmente. Esto ha llevado al estudio de algoritmos de tiempo cuasilineales y el área de big data . Piense, por ejemplo, en los motores de búsqueda: tienen que manejar grandes volúmenes de consultas, procesar grandes cantidades de datos y hacerlo rápidamente. Los algoritmos son más importantes que nunca.

En segundo lugar, el área de aprendizaje automático se está fortaleciendo y está llena de algoritmos (aunque de un tipo diferente al que aprende en su BA). El área está prosperando, y de vez en cuando se inventa un algoritmo verdaderamente nuevo, y mejora significativamente el rendimiento.

En tercer lugar, los algoritmos distribuidos se han vuelto más importantes, ya que estamos llegando a un obstáculo para aumentar la velocidad de procesamiento de la CPU . Hoy en día, el poder de cómputo se incrementa mediante la paralelización , y eso implica algoritmos dedicados.

Cuarto, para contrarrestar la creciente potencia de las CPU, los paradigmas de programación modernos emplean métodos de máquinas virtuales para combatir las lagunas de seguridad. Eso ralentiza estos programas en un factor apreciable. Además del enigma, su sistema operativo está invirtiendo más tiempo de CPU en campanas y silbatos, dejando menos tiempo de CPU para sus programas reales, lo que podría incluir algoritmos intensivos de CPU como la compresión y descompresión de video. Entonces, aunque el hardware es más rápido, no se usa de manera tan eficiente.

En resumen, los algoritmos eficientes son necesarios para manejar grandes cantidades de datos; están surgiendo nuevos tipos de algoritmos en el área de la inteligencia artificial ; los algoritmos distribuidos se están enfocando; y la potencia de la CPU se aprovecha de manera menos eficiente por varias razones (pero principalmente, porque las computadoras se están volviendo más potentes). Los algoritmos aún no están muertos.

Yuval Filmus
fuente
"los algoritmos aún no están muertos" ... por el contrario, es probable que vivamos a través de una "edad de oro de los algoritmos" ....
vzn
12

El conocimiento de los algoritmos es mucho más que cómo escribir algoritmos rápidos.

También le brinda métodos de resolución de problemas (por ejemplo, divide y vencerás, programación dinámica, codiciosa, reducción, programación lineal, etc.) que luego puede aplicar al abordar un problema nuevo y desafiante. Tener un enfoque adecuado generalmente conduce a códigos que son más simples y mucho más rápidos de escribir. Así que tengo que estar en desacuerdo con la respuesta de Kevin, ya que los códigos que no se elaboran cuidadosamente a menudo no solo son lentos sino también complicados. Me gusta esta cita de David Parnas:

A menudo escucho a los desarrolladores descritos como "alguien que sabe cómo construir un sistema grande rápidamente". No hay ningún truco en construir sistemas grandes rápidamente; ¡cuanto más rápido los construyas, más grandes se volverán!

(Por supuesto, también necesitamos combinar algoritmos con métodos de diseño de software para escribir buenos códigos).

El conocimiento de los algoritmos también nos dice cómo organizar sus datos para que pueda procesarlos de manera más fácil y eficiente mediante el uso de estructuras de datos.

Además, nos brinda una forma de estimar la eficiencia de su enfoque y de comprender las compensaciones entre varios enfoques diferentes en términos de complejidad temporal, complejidad espacial y la complejidad de los códigos. Conocer estas compensaciones es la clave para tomar la decisión correcta dentro de sus limitaciones de recursos.

Sobre la importancia de la eficiencia del software, citaré la Ley de Wirth:

El software se vuelve más lento más rápido que el hardware se vuelve más rápido.

Larry Page recientemente reiteró que el software se ralentiza el doble cada 18 meses y, por lo tanto, supera la ley de Moore.

Dai
fuente
7

, son "relativamente" menos importantes en la amplia industria. El editor de texto puede ser "lo suficientemente rápido" y puede que no necesite muchas mejoras. Gran parte del esfuerzo de TI se dirige a garantizar que el componente A escrito en Java funcione con el componente B escrito con C se comunica correctamente a través de la cola de mensajes escrita en Cobol (o algo así), o para llevar el producto al mercado, etc.

Además, la arquitectura se complicó. Cuando tenía procesadores simples y viejos, donde tenía 1 instrucción por ciclo y escribía en conjunto, las optimizaciones eran 'fáciles' (solo necesitaba contar el número de instrucciones). Actualmente no tiene un procesador simple, sino un procesador fuera de orden, superescalar y totalmente interconectado con cambio de nombre de registro y caché de nivel múltiple. Y no escribes en ensamblado sino en C / Java / etc. donde el código está compilado / JITED (generalmente para un mejor código del que tú o yo escribiríamos en ensamblador), o en Python / Ruby / ... donde el código se interpreta y estás separado por varios niveles de abstracción de la máquina. Las microoptimalizaciones son difíciles y la mayoría de los programadores lograrían un efecto contrario.

No , son tan importantes en la investigación como en términos "absolutos" . Hay áreas donde la velocidad es importante ya que operan con gran cantidad de datos. En esta escala, las complejidades importan como se muestra en el ejemplo de Pavel.

Sin embargo, hay otros casos: ir "abajo" de los algoritmos sigue siendo una opción elegida cuando la velocidad es importante (HPC, dispositivos integrados, etc.). Encontrará en muchos grupos universitarios especializados en compiladores y / o optimización de software. Por ejemplo, un simple intercambio de orden de bucles puede acelerar mil veces solo porque utiliza la caché de manera eficiente, mientras que podría ser un ejemplo límite, la brecha de CPU y memoria creció 1000 veces en los últimos 30 años. También Computer Architecture es parte de CS. Por lo tanto, muchas de las mejoras en la velocidad de cálculo son, de hecho, una parte del campo general de CS.

En el aspecto industrial: cuando tiene un clúster HPC, la velocidad es importante porque un solo programa puede ejecutarse durante días, meses o años. No solo debe pagar la factura de electricidad, sino que esperar también puede costar dinero. Puede lanzar el doble de hardware, pero 700 millones de dólares difícilmente pueden considerarse un cambio de bolsillo para todas las compañías, excepto las más grandes; en tales casos, los programadores son la opción más barata y si reescribir el programa en un nuevo idioma significa solo una aceleración 'pequeña', podrían considéralo.

También la velocidad podría significar una mejor experiencia de usuario. Muchas revisiones del sistema operativo de teléfonos móviles indican cuál es 'más ágil' y, aunque puede hacerse mediante 'trucos', sin duda es un área de estudio. También desea acceder a sus datos más rápido y hacer rápidamente lo que necesita. A veces significa que puedes hacer más: en los juegos tienes 0.017 segundos para hacer todo y cuanto más rápido seas, más dulces podrás poner.

Maciej Piechotka
fuente
2

Es una discusión interesante. Y tenemos algunas cosas que ver aquí.

  1. La informática teórica: esta es una ciencia en evolución, lo que significa que a medida que pase el tiempo encontraremos nuevas y mejores formas de resolver problemas, lo que significa mejores algoritmos para buscar y clasificar, por ejemplo.

  2. Comunidades más grandes / bibliotecas más grandes: dado que otras personas han realizado mucho trabajo, podemos basarnos en su trabajo y utilizar los algoritmos que ya han creado e incluso codificado. Y estas bibliotecas se actualizarán con el tiempo, lo que nos permitirá el acceso automático a programas / algoritmos más eficientes.

  3. Desarrollo: ahora tenemos un problema, creo. Muchos programadores no son informáticos, por lo que escriben código para resolver problemas empresariales, no técnicos / teóricos, y estarían tan contentos con una clasificación de burbujas como una clasificación rápida, por ejemplo. Y aquí la velocidad del hardware está permitiendo que los malos programadores se salgan con la suya usando algoritmos malos y prácticas de codificación incorrectas. Memoria, velocidad de CPU, espacio de almacenamiento, estas cosas ya no son preocupaciones importantes y cada pocos meses las cosas se hacen más grandes, más rápidas y más baratas. Me refiero a mirar los nuevos teléfonos celulares. Ahora son más avanzados que las computadoras / servidores mainframe de los años 70/80. Más almacenamiento, más potencia de procesamiento, memoria más rápida.

  4. Interfaz de usuario y datos: la interfaz de usuario / experiencia de usuario y los datos ahora se consideran más importantes que el código súper eficiente en la mayoría de las áreas de desarrollo. Entonces, la velocidad solo se convierte en un problema cuando un usuario tiene que esperar mucho. Si le damos una buena apariencia al usuario y obtiene una buena respuesta de la aplicación, está contento. Y si la empresa sabe que todos los datos se almacenan de forma segura y pueden recuperarlos y manipularlos en cualquier momento, no les importa cuánto espacio necesita.

Entonces, debo decir que no es que los programadores eficientes ya no sean importantes o necesarios, es solo que muy pocas compañías / usuarios recompensan a las personas por ser programadores súper eficientes, y debido a que el hardware es mejor, nos estamos librando de ser menos eficiente. Pero al menos todavía hay personas por ahí enfocadas en la eficiencia y, debido al espíritu comunitario, todos con el tiempo se benefician de esto.

AquaAlex
fuente
1

Algunos otros ángulos sobre esta pregunta interesante y profunda que enfatizan los aspectos interdisciplinarios y transversales del fenómeno. Dai cita la ley de Wirth en su respuesta:

El software se vuelve más lento más rápido que el hardware se vuelve más rápido.

Hay paralelos interesantes de esta idea con los fenómenos observados en la economía. Tenga en cuenta que la economía tiene muchas conexiones profundas con la informática, por ejemplo, en la programación donde los recursos escasos (por ejemplo, subprocesos, etc.) se asignan a pedido, mediante algoritmos de "equilibrio de carga". Otro ejemplo es lo que se llama una cola de productor-consumidor. También, subastas.

También, por ejemplo, Lista de leyes homónimas, Wikipedia :

Ley de Parkinson : "El trabajo se expande para llenar el tiempo disponible para su finalización". Acuñado por C. Northcote Parkinson (1909–1993), quien también acuñó su corolario, "El gasto aumenta para cubrir los ingresos". En computadoras: los programas se expanden para llenar toda la memoria disponible.

Hay una gran similitud también con la paradoja de Jevon que se observó en el aumento del uso de energía después de que las máquinas de vapor Watt más eficientes comenzaron a reemplazar el diseño de Newcomen, pero el uso o la proliferación de los motores aumentaron:

En economía, la paradoja de Jevons (/ ˈdʒɛvənz /; a veces efecto Jevons) es la proposición de que el progreso tecnológico que aumenta la eficiencia con la que se utiliza un recurso tiende a aumentar (en lugar de disminuir) la tasa de consumo de ese recurso.

La analogía es que el hardware es el recurso y el software es como el consumo del recurso (también conocido como oferta versus demanda). Por lo tanto, el software y el hardware (y los avances en cada uno) existen de alguna manera en un circuito de retroalimentación simbiótica estrechamente acoplado entre sí, en cierto sentido, coevolucionando . Hay muchos factores complejos e interrelacionados que influyen en esta interacción, por ejemplo:

vzn
fuente
¿Por qué el voto negativo? La mención de la ley de Parkinson y la paradoja de Jevons me parece muy reveladora.
Yuval Filmus
@YuvalFilmus Mi conjetura: problemas con la gramática. No me pareció que molestara mi capacidad de leer la respuesta demasiado esta vez, pero intenté mejorarla.
Juho
1
No es "problemas con la gramática", es un estilo diferente. Es como decir que un hablante nativo comete "errores" al hablar su propio idioma, mientras que, de hecho, el idioma está cambiando o hay una variación regional. En este caso, es el estilo idiomático de vzn.
Yuval Filmus
-3

No, sobre todo teniendo en cuenta la complejidad del espacio. La capacidad de almacenamiento de una computadora normal está creciendo exponencialmente.

Andy
fuente
No sería verdad al revés: si tiene almacenamiento 'infinito', no necesitaría preocuparse por la complejidad del espacio. El "problema" no es que el almacenamiento crezca, sino que los datos para operar crecen sincronizados, llenando las aceleraciones ofrecidas por el aumento de la potencia de cálculo y la memoria, lo cual es bueno, queremos modelar el cosmos de manera más realista, plegar más proteínas, etc. (PD. No he votado mal)
Maciej Piechotka
44
Es cierto que muchos desarrolladores de aplicaciones móviles parecen asumir recursos infinitos, pero desafortunadamente mi dispositivo es muy finito.
Raphael