Para que você otimiza? [fechadas]

19

De um modo geral, em quais tipos de otimizações você costuma se inclinar ao criar software?

Você é do tipo que prefere otimizar seu design para

  • Tempo de desenvolvimento (ou seja, rápido de escrever e / ou mais fácil de manter)?
  • Tempo de processamento
  • Espaço de armazenamento (RAM, DB, Disco, etc)

É claro que isso é altamente subjetivo ao tipo de problemas que está sendo resolvido e aos prazos envolvidos, então eu gostaria de ouvir sobre os motivos que levariam você a escolher uma forma de otimização em detrimento de outra.

Jason Whitehorn
fonte
Todos os três acima, mas eu quero jogar em geral (que se refere à manutenção). Quando você dedica um tempo para projetar uma estrutura de dados realmente eficiente amplamente aplicável às necessidades do seu software, por exemplo, e testá-la minuciosamente, isso o ajudará por anos e evitará que você tenha que escrever muito mais estruturas de dados estritamente adequadas para solucionar problemas individuais. problemas

Respostas:

40

Manutenção

Em seguida, crie um perfil, se necessário, e otimize a velocidade. Raramente eu já precisei de armazenamento - pelo menos não nos últimos 10 anos. Antes disso eu fiz.

Tim
fonte
8
+1, se você otimizar a capacidade de manutenção, será mais fácil otimizar a velocidade ou o armazenamento mais tarde, se for necessário.
precisa saber é o seguinte
Você ainda precisa considerar pelo menos o tempo de processamento e o armazenamento, para não escolher uma abordagem extremamente excessiva.
@ Thorbjørn, se você estiver otimizando para o tempo do desenvolvedor, provavelmente (mais do que provavelmente) escolherá os algoritmos que são mais fáceis de ler / escrever em um determinado idioma. Somente mais tarde, e somente se o desempenho se tornar um problema, vocês dois (como o @Tim disse) escolhem um criador de perfil.
Jason Whitehorn
@ Jason, eu discordo totalmente. Você deve estar familiarizado com as características de desempenho dos algoritmos que escolher, para escolher uma implementação adequada. Ou seja, escolher um ArrayList quando você precisar principalmente para procurar códigos postais pode não ter uma boa escala.
1
@ Thorbjørn, eu não discordo de você. Na verdade, acho que você está correto, pois deve ser dada atenção aos algoritmos em questão. No entanto, acho que o que diferimos nas opiniões é que, na minha opinião, a idéia de quais algoritmos escolher é algo aprendido através da experiência e corrigido apenas quando um problema se apresenta. Você está correto no seu ponto, só não vejo a necessidade de otimizar isso às custas de menos código legível / mais longo para implementar o código.
9118 Jason Whitehorn
27

Tempo de Desenvolvimento

Processamento e armazenamento são baratos. Seu tempo não é.

Apenas para observar:

Isso não significa fazer um trabalho ruim ao escrever código apenas para finalizá-lo rapidamente. Significa escrever o código de uma maneira que facilite o desenvolvimento rápido. Também depende inteiramente dos seus casos de uso. Se este for um site simples, de duas ou três páginas, com um formulário de contato, você provavelmente não precisará usar uma estrutura PHP. Algumas inclusões e um script de mala direta aceleram o desenvolvimento. Se, em vez disso, o plano é criar uma plataforma flexível para aumentar e adicionar novos recursos, vale a pena dedicar um tempo para defini-lo adequadamente e codificar adequadamente, pois isso acelerará o desenvolvimento futuro.

Na comparação direta com o tempo de processamento e armazenamento, inclino-me para um tempo de desenvolvimento mais rápido. O uso da função de subtração collectionutils é o método mais rápido e mais eficiente em termos de memória para subtrair coleções? Não! Mas é um tempo de desenvolvimento mais rápido. Se você encontrar gargalos de desempenho ou memória, poderá resolvê-los posteriormente. Otimizar antes que você saiba o que precisa ser otimizado é uma perda de tempo e é contra isso que estou defendendo.

Josh K
fonte
4
A lei de Moore terminou cerca de dois anos atrás. Talvez seja hora de começar a pensar em simultaneidade e usar esses núcleos extras. Essa é a única maneira de obter ciclos de relógio baratos no futuro.
Robert Harvey
3
Para ser correto, a lei de Moore ainda está forte com a duplicação do número de transistores em um chip aproximadamente a cada 2 anos, o que está permitindo a colocação de múltiplos núcleos em uma única matriz. O que terminou foi o 'almoço grátis' de um número cada vez maior de ciclos por segundo.
Dominique McDonnell
1
"Processamento e armazenamento são baratos." O cache da CPU e a velocidade do barramento não são. Eles são os principais gargalos de desempenho atualmente.
Mjuba
3
Concordo plenamente com isso. Manter o código legível, usar as ferramentas apropriadas para a tarefa e aderir aos padrões acordados da sua empresa reduzirão significativamente o tempo gasto digitando o código em um computador, economizando muito dinheiro para a empresa. Você está gastando mais tempo com engenharia do que digitando.
precisa saber é o seguinte
1
@ Bill: Ou se você estiver embarcando, onde você pode ter limites rígidos que aumentarão significativamente o custo do produto se você os exceder. Ou para software de servidor, às vezes - se alguém pudesse melhorar o processamento nos servidores do Google em 1%, seria uma economia bastante.
precisa
12

Experiência de usuário.

Este é o único valor que importa para o seu cliente.

Tempo de desenvolvimento é menos importante. Posso escrever um aplicativo de linha de comando com todos os recursos muito mais rápido que uma GUI, mas se a Sra. Jane não conseguir descobrir como fazê-lo cuspir os relatórios que deseja, será inútil.

A manutenção é menos importante. Posso reparar uma gangorra muito rapidamente, mas se estiver no meio de uma floresta, os usuários não a encontrarão.

O tempo de processamento é menos importante. Se eu fabricar um carro que vá de 0 à velocidade da luz em 60 segundos, os usuários não poderão dirigir.

A estética é menos importante. Eu posso pintar uma Mona Lisa, mas se ela estiver escondida atrás de uma parede, ninguém poderá vê-la.

Experiência do usuário é o único valor que importa. Criar um aplicativo que faça exatamente o que o usuário deseja da maneira que ele espera é a conquista final.

Malfist
fonte
Desculpe Joeri, eu meio que me empolguei na minha edição.
Malfist
É um wiki da comunidade para alguma coisa, certo? ;)
Joeri Sebrechts
8

Há apenas uma coisa para otimizar e é:

O que seus clientes querem

Seus clientes precisam do programa mais rápido possível? Otimize para velocidade.

Seus clientes precisam de confiabilidade absoluta? Otimize para isso.

Eles precisam ser entregues amanhã ou será inútil? Otimize para acelerar o desenvolvimento.

Executando em um dispositivo incrivelmente pequeno e com recursos limitados? Otimize para esses recursos.

DJClayworth
fonte
O único problema é que eles geralmente não sabem o que querem ou têm expectativas sobre o que é possível ou útil.
precisa
1
E quando perguntado sobre essa série de perguntas de múltipla escolha, na maioria das vezes você simplesmente ouvirá "sim" :-)
Jason Whitehorn
1
Eu não disse que era fácil. E, pelo menos, se você perguntar, há uma chance de obter uma resposta útil.
DJClayworth
5

Tempo de processamento

O tempo do meu usuário não é barato. O que vem fácil vai fácil.


Acabei de atualizar um aplicativo que utilizo este ano passado. Eles haviam reescrito completamente o aplicativo e, rapaz, foi devagar. Finalmente tive que comprar um computador novo para executá-lo rapidamente. Garanto que não foi barato, mas meu tempo é mais valioso.

user1842
fonte
Visão interessante sobre a inclinação do tempo de processamento. Gostaria de compartilhar que tipo de aplicativos você desenvolve? Estou intrigado.
Jason Whitehorn
1
O tempo de processamento é importante se você executar em muitos computadores. Por exemplo, se for uma opção entre gastar mais 2 meses otimizando ou atualizando 10.000 PCs para um hardware mais novo, nesse caso, o tempo do desenvolvedor não vence. Mas é claro, é um compromisso. Se você executar apenas meia dúzia de servidores, o tempo do desenvolvedor provavelmente vencerá nesse caso.
decano Harding
1
@ Jason, eu tenho facilidade agora, trabalhando com Excel e VBA em um conglomerado de planilhas (que venho condensando rapidamente). Meus usuários trabalham na sala ao lado e informam se tenho algum problema. Minha perspectiva vem do uso de computadores por trinta anos, e a observação de aplicativos continua inchando, forçando as atualizações com muita compensação. Eu sei que os desenvolvedores podem fazer melhor, eles apenas precisam adquirir o hábito de escrever código eficiente.
+10 para o código eficiente. Isso é muitas vezes esquecido, especialmente em programação modular. Todo módulo é executado a uma velocidade razoável, mas a soma de todos pode ser terrivelmente lenta.
Joris Meys
4

Tenho tendência a limitar o consumo e alocações de memória. Eu sei que é da velha escola, mas:

  • A maior parte do código não descartável que escrevo é fortemente paralela. Isso significa que a alocação excessiva de memória e a atividade de coleta de lixo serializarão muitos códigos paralelizáveis. Isso também significa que haverá muita disputa por um barramento de memória compartilhada.
  • Meu idioma principal é D, que ainda não possui um bom suporte de 64 bits (embora isso esteja sendo remediado).
  • Eu trabalho com conjuntos de dados razoavelmente grandes regularmente.
dsimcha
fonte
+1 por trabalhar para evitar bloatware. Programas de consumo de memória são programas ruins.
Programas de consumo de memória podem ser executados em sistemas de 64 bits, em geral. Foi o que fizemos quando um de nossos aplicativos teve problemas de memória (ele legitimamente usa grandes quantidades de memória). O primeiro ponto é importante quando o desempenho é.
precisa
2

Eu diria que otimizo para a eficiência, com a eficiência sendo definida como um compromisso entre o tempo de desenvolvimento, a manutenção futura, a experiência do usuário e os recursos consumidos. Como desenvolvedor, você precisa manipular tudo isso para manter algum tipo de equilíbrio.

Como você alcança esse equilíbrio? Bem, primeiro você precisa estabelecer algumas constantes, como qual é o prazo final, em qual hardware seu aplicativo estará sendo executado e que tipo de pessoa o usará. Sem conhecê-los, você não pode estabelecer o equilíbrio correto e priorizar onde é necessário.

Por exemplo, se você estiver desenvolvendo um aplicativo de servidor em uma máquina poderosa, poderá trocar a eficiência do desempenho para garantir um prazo imutável. No entanto, se o seu desenvolvedor for um aplicativo que precisa responder rapidamente à entrada do usuário (pense em um videogame), será necessário priorizar sua rotina de entrada para garantir que ela não fique atrasada.

Dan Diplo
fonte
2

Qualquer que seja a tecnologia de virtualização que estou usando

Lembra-se dos dias em que sistemas com mais de 512 MB de RAM eram considerados de ponta? Passo meus dias escrevendo código para o anterior.

Eu trabalho principalmente em programas de baixo nível que são executados no domínio privilegiado em um ambiente Xen. Nosso limite máximo para o domínio privilegiado é de 512 MB, deixando o restante da RAM livre para uso de nossos clientes. Também é típico limitarmos o domínio privilegiado a apenas um núcleo da CPU.

Então, aqui estou eu, escrevendo código que será executado em um novo servidor de US $ 6k, e cada programa deve funcionar (idealmente) dentro de um limite de 100kb alocado ou evitar completamente a alocação dinâmica de memória.

Conciso, eu otimizo para:

  • Pegada na memória
  • Classifica (onde a maior parte do meu código passa a maior parte do tempo)

Eu também tenho que ser extremamente diligente quando se trata de tempo gasto esperando por bloqueios, esperando E / S ou apenas esperando em geral. Uma quantidade substancial de meu tempo é destinada a melhorar as bibliotecas de soquetes não bloqueantes existentes e a procurar métodos mais práticos de programação sem bloqueio.

Todos os dias, acho um pouco irônico escrever código como 15 anos atrás, em sistemas comprados no mês passado, devido a avanços na tecnologia.

Isso também é típico para quem trabalha em plataformas embarcadas, embora muitos deles tenham pelo menos 1 GB à sua disposição. Como Jason salienta, também é típico ao escrever programas para serem executados em dispositivos móveis. A lista continua: quiosques, thin clients, molduras, etc.

Estou começando a pensar que as restrições de hardware realmente separam os programadores das pessoas que podem fazer algo funcionar sem se importar com o que realmente consome. Preocupo-me (vote-me se for necessário) que linguagens que abstraem completamente o tipo e a memória verificando o conjunto coletivo de senso comum que (costumava ser) compartilhado entre programadores de várias disciplinas.

Tim Post
fonte
1
+1 para o ângulo de impressão do pé da memória. Eu nunca codifiquei as restrições específicas com as quais você está lidando, mas remova a primeira seção que fala sobre o Xen e substitua-a pelo iPhone e eu sei exatamente de onde você é :-)
Jason Whitehorn
2

Resultados da pesquisa

Como acadêmico, achei que deveria compartilhar o que otimizar. Observe que isso não é o mesmo que otimizar por um tempo mais curto de desenvolvimento. Muitas vezes, isso significa que o trabalho pode apoiar alguma questão de pesquisa, mas não ser um produto polido e que pode ser entregue. Isso pode ser visto como um problema de qualidade e pode explicar por que muitos dizem que os cientistas da computação (acadêmicos) não têm nenhuma experiência no "mundo real". (Por exemplo, "Eles não saberiam como desenvolver um produto a ser entregue?" )

É uma linha tênue. Em termos de impacto, você quer que seu trabalho seja usado e citado por outros, e o Iceberg Effect de Joel entra em jogo: um pouco de brilho e brilho podem percorrer um longo caminho. Mas se você não estiver criando uma base para outros projetos serem construídos, talvez não consiga justificar o tempo gasto na produção de um produto que pode ser entregue.

Macneil
fonte
1
  1. Projeto
    • baixo acoplamento, modular
    • áreas funcionais concisas, bem definidas
    • bem documentado
    • refatorar continuamente para cruft
  2. Manutenção
    • compilação e depuração reproduzíveis
    • testes de unidade
    • testes de regressão
    • fonte de controle

... depois disso tudo o resto

... finalmente, otimizar o desempenho ;-)

cmcginty
fonte
1

Qualidade / Teste

Otimize para a qualidade, como para garantir que haja tempo no cronograma de desenvolvimento para testes, tanto de unidade quanto de teste após os recursos / fases.

DBlackborough
fonte
1

Depende da necessidade do seu programa.

A maior parte do que faço é fortemente restringida pela capacidade de processamento e memória, mas não passa por muitas mudanças significativas, se houver alguma, na média do ano.

No passado, trabalhei em projetos nos quais o código é alterado com frequência, para que a manutenção se torne mais importante nesses casos.

Também trabalhei em sistemas no passado em que a quantidade de dados é o problema mais significativo, mesmo em disco para armazenamento, mas mais comumente o tamanho se torna um problema quando você precisa mover muito os dados ou lentamente. ligação.

Conta
fonte
1

Elegância .

Se seu código for bem projetado, ele terá vários efeitos:

  1. Será mais fácil manter (reduzir custos para o cliente)
  2. Será mais fácil otimizar (para JIT ou compiladores completos)
  3. Será mais fácil substituir (quando você pensar em uma solução melhor)
Benjamin Chambers
fonte
0

Tempo de desenvolvimento, absolutamente. Também otimizo a largura de banda, mas não uso o binário.

Christopher Mahan
fonte
0

Como faço instalações em vários tipos de sistemas, desde o mainframe da IBM até os PCs, primeiro otimizo a compatibilidade, o tamanho e a velocidade.

Dave
fonte
0

Depende

Se você estiver trabalhando em um sistema de processamento de vídeo incorporado em tempo real, otimizará a velocidade de processamento. Se você estiver trabalhando em um processador de texto, otimizará o tempo de desenvolvimento.

No entanto, em todos os casos, seu código deve funcionar e deve ser mantido.

Dima
fonte
0

Expressividade da minha intenção.

Quero que alguém que esteja lendo meu código possa ver facilmente quais operações eu estava tentando invocar no domínio. Da mesma forma, tento minimizar o lixo não-semântico (chaves, palavras-chave de 'função' em js, etc.) para facilitar a verificação.

É claro que você precisa equilibrar isso com a manutenção. Adoro escrever funções que retornam funções e todos os tipos de técnicas avançadas e elas REALMENTE aumentam meu objetivo, mas se o benefício for pequeno, cometerei um erro ao aderir a técnicas com as quais os programadores jr sólidos estariam familiarizados.

George Mauer
fonte
-6

Todos eles

Tempo de processamento

Os computadores de hoje são rápidos, mas longe do que é suficiente. Existem muitas situações em que o desempenho é crítico - se você fizer o streaming de servidores de mídia.

Armazenamento

Seu cliente pode ter um disco grande, digamos, 1 TB. O que pode ser capturado por 1000 filmes em HD; se você deseja torná-lo um serviço, está longe de ser suficiente, não é?

Tempo de desenvolvimento

Bem, não tenho certeza se isso conta como "otimização", o que faço é usar Java em vez de C ++, e o desenvolvimento fica 10 vezes mais rápido. Sinto que estou dizendo o que penso diretamente ao computador, muito direto frente e totalmente rochas!

BTW eu acredito que para acelerar o desenvolvimento do seu processo de desenvolvimento, você deve escolher java, nunca tente lixo como python ... que afirma que eles podem reduzir o tempo de DEV.

tactoth
fonte
Você pode achar isso interessante: paulgraham.com/avg.html - discute a força das linguagens de programação.
3
Com tempo e orçamento limitados, você não pode gastar tempo com todos eles - deve haver alguma prioridade.
precisa saber é o seguinte
@JRBWilkinson Bem, deve ser caso a caso
tactoth 11/11