Como comprar poder de computação é muito acessível do que no passado, o conhecimento de algoritmos e a eficiência são cada vez menos importantes? É claro que você deseja evitar um loop infinito, portanto, nem tudo acontece. Mas se você tiver um hardware melhor, poderia ter um software pior?
efficiency
Quora Feans
fonte
fonte
Respostas:
Eu realmente gosto do exemplo do livro Introdução aos algoritmos , que ilustra o significado da eficiência do algoritmo:
Vamos comparar dois algoritmos de classificação: classificação por inserção e classificação por mesclagem . Sua complexidade é e respectivamente. Normalmente, a classificação de mesclagem tem um fator constante maior, então vamos supor . O ( n log n ) = c 2 n lg n c 1 < c 2O(n2)=c1n2 O(nlogn)=c2nlgn c1<c2
Para responder sua pergunta, avaliamos o tempo de execução de um computador mais rápido (A) executando o algoritmo de classificação por inserção contra o computador mais lento (B) executando o algoritmo de classificação por mesclagem.
Nós presumimos:
Então, com essas suposições, é preciso
para o computador B.
Assim, o computador, que é 1000 vezes mais lento, pode resolver o problema 17 vezes mais rápido. Na realidade, a vantagem da classificação por mesclagem será ainda mais significativa e aumentará com o tamanho do problema. Espero que este exemplo ajude a responder sua pergunta.
No entanto, isso não é tudo sobre complexidade do algoritmo. Hoje, é quase impossível obter uma aceleração significativa apenas com o uso da máquina com maior frequência de CPU. As pessoas precisam projetar algoritmos para sistemas com vários núcleos que escalam bem. Essa também é uma tarefa complicada, porque, com o aumento de núcleos, uma sobrecarga (para gerenciar acessos à memória, por exemplo) também aumenta. Portanto, é quase impossível obter uma aceleração linear.
Então, para resumir, o design de algoritmos eficientes hoje em dia é igualmente importante como antes, porque nem o aumento da frequência nem os núcleos extras fornecerão a aceleração em comparação com a trazida pelo algoritmo eficiente.
fonte
Pelo contrário. Ao mesmo tempo em que o hardware está ficando mais barato, vários outros desenvolvimentos ocorrem.
Primeiro, a quantidade de dados a serem processados está crescendo exponencialmente. Isso levou ao estudo de algoritmos de tempo quaseilineares e à área de big data . Pense, por exemplo, nos mecanismos de pesquisa - eles precisam lidar com grandes volumes de consultas, processar grandes quantidades de dados e fazê-lo rapidamente. Os algoritmos são mais importantes do que nunca.
Segundo, a área de aprendizado de máquina está crescendo forte e cheia de algoritmos (embora de um tipo diferente do que você aprende em seu BA). A área está prosperando e, de tempos em tempos, um algoritmo verdadeiramente novo é inventado e melhora significativamente o desempenho.
Terceiro, algoritmos distribuídos tornaram-se mais importantes, pois estamos atingindo um obstáculo no aumento da velocidade de processamento da CPU . Atualmente, o poder da computação está sendo aumentado pela paralelização , e isso envolve algoritmos dedicados.
Quarto, para contrabalançar o poder crescente das CPUs, os paradigmas de programação modernos empregam métodos de máquina virtual para combater brechas na segurança. Isso atrasa esses programas por um fator apreciável. Além do enigma, seu sistema operacional está investindo mais tempo de CPU em sinos e assobios, deixando menos tempo de CPU para seus programas reais, o que pode incluir algoritmos intensivos em CPU, como compactação e descompressão de vídeo. Portanto, embora o hardware seja mais rápido, ele não é usado com a mesma eficiência.
Resumindo, algoritmos eficientes são necessários para lidar com grandes quantidades de dados; novos tipos de algoritmos estão surgindo na área de inteligência artificial ; algoritmos distribuídos estão entrando em foco; e a energia da CPU é aproveitada com menos eficiência por vários motivos (mas principalmente porque os computadores estão ficando mais poderosos). Algoritmos ainda não estão mortos.
fonte
O conhecimento de algoritmos é muito mais do que como escrever algoritmos rápidos.
Também fornece métodos de solução de problemas (por exemplo, dividir e conquistar, programação dinâmica, ganancioso, redução, programação linear etc.) que você pode aplicar ao abordar um problema novo e desafiador. Ter uma abordagem adequada geralmente leva a códigos mais simples e muito mais rápidos de escrever. Portanto, tenho que discordar da resposta de Kevin, pois os códigos que não são cuidadosamente reunidos geralmente são não apenas lentos, mas também complicados. Eu gosto desta citação de David Parnas:
(Obviamente, também precisamos combinar algoritmos com métodos de design de software para escrever bons códigos.)
O conhecimento de algoritmos também nos diz como organizar seus dados para que você possa processá-los com mais facilidade e eficiência através do uso de estruturas de dados.
Além disso, fornece uma maneira de estimar a eficiência de sua abordagem e entender as vantagens e desvantagens entre várias abordagens diferentes em termos de complexidade de tempo, complexidade de espaço e complexidade dos códigos. Conhecer essas compensações é a chave para tomar a decisão certa dentro de suas restrições de recursos.
Sobre a importância da eficiência do software, cito a Lei de Wirth:
Larry Page recentemente reafirmou que o software fica duas vezes mais lento a cada 18 meses e, portanto, ultrapassa a lei de Moore.
fonte
Sim , eles são 'relativamente' menos importantes em uma ampla indústria. O editor de texto pode ser 'rápido o suficiente' e pode não precisar de muitas melhorias. Grande parte do esforço de TI é garantir que o componente A escrito em Java funcione com o componente B escrito com C se comunique corretamente por meio da fila de mensagens gravadas em Cobol (ou algo assim), ou para colocar o produto no mercado etc.
Além disso, a arquitetura ficou complicada. Quando você tinha processadores simples e antigos, onde tinha 1 instrução por ciclo e escreveu na montagem, as otimizações foram 'fáceis' (você só precisava contar o número de instruções). Atualmente, você não possui um processador simples, mas um processador totalmente pipeline, superescalar e fora de ordem, com renomeação de registro e cache de vários níveis. E você não escreve em assembly, mas em C / Java / etc. onde o código é compilado / JIT (normalmente, para melhor codificar, você ou eu escreveríamos em assembly) ou em Python / Ruby / ... onde o código é interpretado e você é separado por vários níveis de abstração da máquina. As microoptimalizações são difíceis e a maioria dos programadores obteria efeito oposto.
Não , eles são sempre tão importantes em pesquisa e em termos "absolutos" . Há áreas em que a velocidade é importante, pois elas operam com grande quantidade de dados. Nesta escala, as complexidades são importantes, como mostra o exemplo de Pavel.
No entanto, existem outros casos - descer dos algoritmos ainda é uma opção escolhida quando a velocidade é importante (HPC, dispositivos incorporados etc.). Você encontrará em muitas universidades grupos especializados em compiladores e / ou otimização de software. Por exemplo, uma troca simples de pedidos de loop pode obter uma aceleração de mil vezes apenas porque utiliza cache de maneira eficiente - embora possa ser um exemplo limítrofe, a diferença de CPU e memória cresce 1000 vezes nos últimos 30 anos. A arquitetura de computadores também faz parte do CS. Portanto, muitas das melhorias na velocidade da computação são de fato parte do campo geral do CS.
No lado industrial - quando você tem um cluster de HPC, a velocidade é importante porque um único programa pode ser executado por dias, meses ou anos. Não apenas você precisa pagar a conta de luz, mas também a espera pode custar dinheiro. Você pode jogar o dobro do hardware, mas US $ 700 milhões dificilmente pode ser considerado uma mudança de bolso para todas as empresas, exceto as maiores - nesses casos, os programadores são a opção mais barata e, se reescrever o programa em um novo idioma significar apenas uma aceleração 'pequena' - eles podem considere isso.
Velocidade também pode significar melhor UX. Muitas revisões de sistemas operacionais de telefones celulares afirmam qual é 'mais rápido' e, embora possa ser feito por 'truques', é certamente uma área de estudo. Além disso, você deseja acessar seus dados mais rapidamente e rapidamente fazer o que precisa. Às vezes, significa que você pode fazer mais - em jogos você tem 0,017s para fazer tudo e quanto mais rápido você é, mais doces você pode colocar.
fonte
É uma discussão interessante. E temos algumas coisas para analisar aqui.
A ciência da computação teórica - Esta é uma ciência em evolução, que significa que, com o passar do tempo, encontraremos novas e melhores maneiras de resolver problemas, o que significa algoritmos aprimorados para pesquisa e classificação, por exemplo.
Comunidades maiores / bibliotecas maiores - Como muito trabalho foi realizado por outras pessoas, podemos apenas desenvolver seu trabalho e usar os algoritmos que eles já criaram e até mesmo codificaram. E essas bibliotecas serão atualizadas com o tempo, permitindo o acesso automático a programas / algoritmos mais eficientes.
Desenvolvimento - Agora, aqui temos um problema, eu acho. Muitos programadores não são cientistas da computação, então escrevem código para resolver problemas de negócios, não problemas técnicos / teóricos e ficariam tão felizes usando um tipo de bolha quanto um tipo rápido, por exemplo. E aqui a velocidade do hardware está permitindo que maus programadores se safem do uso de algoritmos e práticas de codificação ruins. Memória, velocidade da CPU, espaço de armazenamento, essas coisas não são mais grandes preocupações e, a cada poucos meses, as coisas estão ficando maiores, mais rápidas e mais baratas. Quero dizer, olhe para os novos celulares. Eles agora são mais avançados que os computadores / servidores de mainframe dos anos 70/80. Mais armazenamento, mais poder de processamento, memória mais rápida.
Interface do usuário e dados - Interface do usuário / experiência do usuário e dados agora são considerados mais importantes do que códigos super eficientes na maioria das áreas de desenvolvimento. Portanto, a velocidade só se torna problemática quando um usuário precisa esperar muito. Se dermos ao usuário uma boa aparência e ele receber uma boa resposta do aplicativo, ele ficará feliz. E se as empresas souberem que todos os dados estão armazenados de maneira segura e puderem recuperá-los e manipulá-los a qualquer momento, não se importam com a quantidade de espaço necessária.
Então, eu diria que não é que programadores eficientes não sejam mais importantes ou necessários, apenas poucas empresas / usuários recompensam as pessoas por serem programadores super eficientes e, por causa do hardware ser melhor, estamos nos saindo menos eficiente. Mas pelo menos ainda existem pessoas por aí focando na eficiência e, devido ao espírito da comunidade, todos ganham tempo com isso.
fonte
Alguns outros ângulos dessa questão interessante e profunda que enfatiza os aspectos interdisciplinares e transversais do fenômeno. Dai cita a lei de Wirth em sua resposta:
Existem paralelos interessantes dessa idéia com os fenômenos observados na economia. Observe que a economia tem muitas conexões profundas com a ciência da computação, por exemplo, por exemplo, agendamento onde recursos escassos (como threads etc.) são alocados a pedido, por algoritmos de "balanceamento de carga". Outro exemplo é o que é chamado de fila produtor-consumidor. Além disso, leilões.
Também por exemplo, Lista de leis de mesmo nome, Wikipedia :
Também existe uma forte semelhança com o paradoxo de Jevon, que foi observado no aumento do uso de energia depois que os motores a vapor Watt mais eficientes começaram a substituir o design Newcomen, mas o uso ou proliferação dos motores aumentou:
A analogia é que o hardware é o recurso e o software é como o consumo do recurso (também conhecido como oferta versus demanda). Portanto, software e hardware (e os avanços em cada um) existem de certa forma em um ciclo de feedback simbiótico fortemente acoplado entre si, em certo sentido, co-evoluindo . Existem muitos fatores complexos e inter-relacionados que influenciam essa interação, por exemplo:
fonte
Não, principalmente considerando a complexidade do espaço! A capacidade de armazenamento de um computador normal está crescendo exponencialmente.
fonte