É importante que uma solução seja eficiente?

9

Eu resolvo muitos problemas, principalmente do Top Coder. Vou obter respostas para muitos, mas na maioria das vezes acabo com uma solução ineficiente.

Nas implementações do mundo real - realmente importa que uma solução para o problema seja eficiente? Se sim, como posso melhorá-lo?

Formigas
fonte
4
Você está perguntando do ponto de vista do concurso ou do ponto de vista de implementações do mundo real?
rjzii
@RobZ: Nas implementações do mundo real
Ant's
11
"mundo real" cobre muito terreno. Embutido? Aplicativos de servidor? Aplicações Móveis? Software de computador pessoal para usuário único? Simulações científicas? As respostas não são necessariamente as mesmas para eles.
David Thornley

Respostas:

34

A melhor solução é aquela que (em ordem crescente de importância) é eficiente, sustentável e feita .

^^^ Essa é a única coisa que você realmente precisa tirar desta resposta. ^^^

Eficiência é importante . Talvez um pouco menos do que costumava ser devido à nossa abundância de hardware, mas o desempenho é um recurso . Em uma competição, a eficiência é obviamente importante. Você deve saber escrever código eficiente. Mais importante, você deve conhecer as práticas recomendadas que produzirão código eficiente e de bom desempenho, sem sacrificar a pontualidade ou a capacidade de manutenção de um aplicativo. É aqui que a profundidade da experiência com uma plataforma e idioma gera muitos rendimentos.

Mais importante (em 95% dos casos), é ter uma solução finalizável e sustentável. Sem um produto acabado , não importa a eficiência ou a manutenção da solução. Se você demorar um tempo extraordinário para rastrear e corrigir um bug ou adicionar um novo recurso, não importa a eficiência da solução. Mas eficiência e desempenho são indubitavelmente importantes, não importa o que alguém possa dizer.

Mike Cellini
fonte
3
Sim. E um programa terrivelmente ineficiente que está correto e pronto oferece a você algo para testar suas melhorias.
Mike Sherrill 'Cat Lembre-se'
11
A parte mais importante disso é conhecer as melhores práticas de eficiência, especialmente no desenvolvimento de bancos de dados, onde eu pessoalmente colocaria a eficiência acima da capacidade de manutenção. Os usuários se preocupam desesperadamente com o desempenho. Muitas vezes, vejo que códigos mais eficientes são mais difíceis de manter, mas apenas devido à falha do desenvolvedor em entender o código mais eficiente, para começar, depois de se familiarizar com as técnicas, você as utiliza como primeira opção. e eles se tornam mais fáceis de manter, porque você entende por que eles funcionam.
HLGEM
@HLGEM Se houver alguma parte desta resposta que eu gostaria de reforçar como princípio geral (além da primeira linha), é conhecer as melhores práticas para escrever código eficiente. E você está certo com o comentário sobre SQL eficiente sendo importante.
Mike Cellini
8

Eu concordo com Mike Cellini, a única coisa que gostaria de acrescentar é.

Algo é "suficientemente eficiente"? Por exemplo, do ponto de vista do usuário, não há muita diferença entre uma função que é concluída em 0,00001 segundos ou uma que é concluída em 0,1 segundos, mesmo que uma seja muito mais eficiente que a outra. Uma função que é concluída em 10 minutos não é muito diferente (para o usuário) de uma função que é concluída em 12 minutos. Nos dois casos, o usuário tomaria uma xícara de café ou continuaria com outra tarefa.

Cheguei a ver a eficiência como "um usuário eficiente" e não um algoritmo eficiente.

Jaydee
fonte
A regra geral que ouvi é que uma melhoria de 20% pode ser percebida por um usuário. Ambos parecem se qualificar, acho que um usuário pode realmente sentir uma diferença na capacidade de resposta entre 0,1 e 0,0001 segundo.
22612 Chris Pitman
Chris, você pode estar certo de que um usuário pode notar a diferença entre os dois sistemas lado a lado, mas um sistema tornaria um usuário notavelmente mais eficiente em seu trabalho? Minha observação (eu venho fazendo isso há mais de 25 anos) é que os dois sistemas permitiriam ao usuário fazer a mesma quantidade de trabalho em um determinado momento.
21412 Jaydee
2

Em geral, a solução mais importante para um problema será a que realmente existe e é válida para os casos como eles existem para o seu problema. Em outras palavras, evite a otimização prematura até que você realmente saiba que possui um código ineficiente ou um código eficiente que precisa ser mais rápido.

Além disso, não esqueça que a melhor solução para o seu aplicativo pode não ser a solução geral do caso. Caso e argumento, alguns anos atrás, um professor deu à nossa turma um problema no qual deveríamos imprimir os 10 primeiros números de um determinado tipo (desculpe, minha memória me falha quanto ao tipo, mas esse era um dos números mais incomuns classes) e fomos submetidos a um teste para verificar se o número era do tipo especificado. Essa foi a extensão do problema que nos foi dado e fomos informados de que era devido no dia seguinte, com a solução mais eficiente recebendo crédito total. A seguinte palestra do professor resumiu os resultados:

  • Alguns alunos usaram um loop simples e a fórmula fornecida para verificar se os números estavam corretos e os exibiu, lentos, mas concluíram o trabalho, O (n ^ 3).
  • Outros estudantes fizeram sua pesquisa e encontraram uma fórmula que fazia um trabalho melhor de verificação para garantir que um determinado número fosse válido; esses programas eram muito mais rápidos, O (n ^ 2).
  • Um aluno usou a fórmula lenta para gerar os valores e depois os copiou em uma matriz constante em seu código e exibiu o conteúdo disso, O (n).

A solução final foi considerada a mais eficiente pelo professor. Acontece que o problema era realmente um exercício para entender completamente o problema e não apenas sair e encontrar a solução mais eficiente.

O ponto acima é que, quando se trata de encontrar um problema para uma solução eficiente, geralmente é melhor dedicar algum tempo para garantir que você realmente entenda qual é o problema antes de começar a escrever o código ou tentar otimizar o código. Se você pode armazenar um conjunto de valores de referência em uma matriz constante, é melhor fazer isso do ponto de vista de desempenho do que tentar escrever algum algoritmo sofisticado.

Da mesma forma, não esqueça que, para a maioria dos aplicativos, as únicas pessoas que tendem a ver código ineficiente (quando não é desnecessariamente ineficiente!) São os próprios desenvolvedores. Se você escrever um código limpo que faça exatamente o que é necessário, é provável que na maioria das vezes os usuários não notem problemas de desempenho ao trabalhar com o programa e quando otimizem apenas as partes mencionadas. você.

rjzii
fonte
2

Isso depende da estrutura do concurso, mas geralmente sim: o desempenho é considerado na maioria das vezes, de acordo com a documentação deles . Às vezes, como no link posterior, você precisa caçar, mas citar:

Escreva um código limpo, claro e eficiente. Embora não exista um item de linha de revisão específico para isso, é provável que os revisores reajam melhor a códigos fáceis de ler e entender. Com um código eficiente, você obtém uma vantagem potencial de desempenho em testes de estresse e benchmark, bem como elogios prováveis ​​(e alguns pontos extras) dos revisores.

A melhor maneira de melhorar isso é escrever um código eficiente, que você já está fazendo. Mesmo se você concluir o trabalho, dedique algum tempo a melhorar sua eficiência - mesmo após a competição - e isso será recompensado.

Você provavelmente também deseja investir em teoria, como livros sobre algoritmos , que podem oferecer duas coisas: ferramentas mais eficientes para resolver um problema específico e mecanismos mais eficientes para identificar qual é o problema que você tem que resolver.

Por fim, os cursos de ciência da computação estão cada vez mais disponíveis on - line e cobrem o histórico que você precisa melhorar.

Daniel Pittman
fonte
Há uma edição mais recente do manual de design do algoritmo. (11 anos entre os dois). Há algo errado com o mais novo? Especialmente porque é mais barato que o antigo. Nesse caso, talvez isso deva ser tratado em sua resposta.
World Engineer
Não, apenas listei o primeiro que encontrei na Amazon e não me incomodei em verificar se era a segunda edição.
Daniel Pittman
1

A eficiência de uma solução depende de vários fatores. O mais importante é saber o que seu usuário deseja. Aqui estão alguns exemplos.

  1. Se você é o único usuário de um bloco de código e funciona muito bem para você, provavelmente está bem.
  2. Se seu programa for vendido, será necessário ter uma plataforma de destino. Teste com esta plataforma. Se o programa for excepcionalmente lento, você precisará trabalhar para torná-lo mais eficiente. Se lhe parecer bom, entregue-o a outros usuários e verifique se eles concordam.
  3. Talvez o programa tenha outras considerações. Se você está construindo, digamos, um programa baseado em servidor, pode ser necessário trabalhar muito para tornar o programa o mais eficiente possível. Ou, se for executado em um microprocessador, verifique se também funciona lá.

Como tornar seu código mais eficiente:

  1. O primeiro passo é ter uma idéia do que está demorando mais tempo. O truque é fazer algo chamado código de criação de perfil. Procure o que está demorando mais e veja se consegue descobrir uma maneira de fazê-lo funcionar mais rápido.
  2. Talvez o principal fator limitante seja a memória. Se for esse o caso, procure o que está ocupando grandes pedaços de memória e veja como você pode reduzi-lo.

Há um campo inteiro para a otimização, mas as duas dicas acima devem pelo menos começar.

PearsonArtPhoto
fonte
1

Para uma competição, você precisa entender quem são os juízes e o que eles são - se eles estão procurando ótimos codificadores e nada mais, então você receberá elogios por um código mais eficiente.

Por via de regra, no mundo real, isso não importa. Uma das idéias principais do desenvolvimento de software é "Não otimizar o que você não conhece precisa ser otimizado" e, em seguida, "Otimizar somente quando tiver sido provado que é necessário"

Muitos profissionais argumentam que isso leva a códigos ineficientes e inchados que não podem ser facilmente corrigidos e, em alguns casos extremos (sobre os quais eles cantam como se fosse o que a maioria dos codificadores faz o dia todo, todos os dias), eles estão corretos. No entanto, poucos projetos de desenvolvimento de software mediram os resultados "Desempenho: mais rápido que o necessário, Custo: Quem se importa, Prazo de entrega: em algum momento desta década" No mundo real, geralmente é "Quero barato, quero ontem, quero para funcionar ".

mattnz
fonte