Executando verificação de segurança...
1

[DÚVIDA] Como saber quanto o meu código vai consumir de recursos?

Eu estou desenvolvendo um projetinho simples onde é gerado senhas aleatórias e fortes para o usuário. Vou hospedar ele na AWS e sei que dependendo do que eu escrever, posso evitar o consumo exacerbado de recursos por conta de um código podre.

Como posso saber quanto de processamento e memória o meu código roda? O que preciso estudar pra entender esse assunto e o que posso fazer para melhorar a perfomance dele?

2

Pela minha experiência, existem muitos fatores que influenciam isso, alguns deles estão praticamente fora da nossa possibilidade de influenciar.

Mas, existem duas formas de conseguir ter essa resposta que são utilizadas para resolver probemas de desempenho com mais facilidade.

A primeira delas é fazer uma análise da complexidade do teu código (o famoso Big O). Com essa análise, você poderá identificar pontos do teu código que podem ser melhorados para ter uma complexidade melhor. E, importante notar, que nesse caso, eu não me refiro à complexidade como o quão legível o teu código é, mas o quão complexas as operações que serão executadas são e, por consequência, o quanto de tempo de processamento será utilizado. Um exemplo da importancia disso é o caso de algoritmos de sort, pois existem várias formas de implementar o sort de um array, mas algumas são mais eficientes do que outras.

A segunda forma, é você realizar um teste de estresse na tua aplicação e monitorar como ela se comporta nesse cenário. Então, por exemplo, vamos supor que você suba uma máquina EC2 na AWS, com um microserviço Java, você pode utilizar o Jmeter para gerar massa e tráfego para a tua aplicação, e utilizar o VisualVM ou algo do tipo para coletar informações da JVM e compreender onde estão os gargalos da tua aplicação...

De qualquer forma, é sempre bom ter em mente as boas práticas e conhecer a linguagem que você está utilizando, por exemplo, acessar o banco de dados é sempre custoso, então você deve buscar apenas o necessário quando for necessário, em java, concatenar strings provoca muito trafego de memória, o que é custoso também, então se tu sabe que vai precisar ficar concatenando strings, é melhor utilizar um StringBuilder, que é muito mais eficiente nisso. Além disso, as linguagens podem ter recursos que podem melhorar o desempenho do código em tempo de compilação, como é o caso de Branch Prediction em Java, e saber dessas peculiaridades podem influenciar na forma como você desenvolverá o teu código para torná-lo mais eficiente.

E no geral, não se despere quando notar que existe muita coisa que influencia nisso e, por consequência, muita coisa para aprender. O jeito é manter a constãncia e não desistir.

1
1
1

o limite de uso das lambdas é beeem generoso, para começar a gerar cobrança vc precisa fazer bastante coisa errada...ainda assim capaz que esbarre na limitação de timeout

1

Li em algum post que você pretende rodar seu serviço em Lambda, isso me lembrou um post em um blog sobre uma empresa que gastou milhares pois a API consumia muito tempo e recuso para ser processada, e migrando isso para um simples cluster k8s, eles diminuíram bastante isso. Mas vamos lá.

1 - Como vou saber quanto meu código vai consumir?

  • Bem, você precisa fazer um teste, sabe em média quantas requisições por mês sua lambda terá.
  • Com isso, você pode executá-la algumas vezes (10?) e ver quanto tempo e memória ela consumiu.
  • De posse desses dados, use a calculadora da AWS e coloqueo o número de requisições, tempo médio de processamento e memória consumida.

Você pode limitar o uso de memória, mas isso pode aumentar o tempo de resposta, você precisa balancear isso e achar qual melhor valor. Sobre processamento, ele está atrelado a memória, você não consegue mudar isso.

Em resumo, um teste de carga controlado feito por você, coletando essas métricas e calculando na calculadora da AWS vai lhe fornecer valores próximos do uso real.

E se for o caso, existem dezenas de forma de otimizar isso como limitar o numero de requests, uso de recursos e etc.

1
1
1

Vc não disse qual linguagem está usando, mas enfim...

Praticamente todas as linguagens (pelo menos as mais usadas) possuem profilers: ferramentas que analisam a performance de um programa.

As funcionalidades variam, mas de forma geral elas mostram o consumo de memória e CPU, entre outras informações. Os mais detalhados mostram as informações segmentadas por funções/métodos, quantas instâncias de cada classe são criadas, etc. Assim vc consegue saber quais os pontos críticos e gargalos do seu sistema.

Não vou listar tudo porque é muita coisa, mas basta fazer uma busca "[nome da linguagem] profiler", teste algumas e veja qual gosta mais.

Sugiro testar com dados reais, ou o mais próximo possível disso. Faça alguns testes dobrando a quantidade de dados e veja como o consumo aumenta (linearmente, exponencialmente, etc). Isso indica se o algoritmo usado pode ser melhorado, por exemplo.

Claro, o teste pra valer vai ser só no ambiente de produção, em situações reais. Mas um bom teste com ferramentas de análise adequadas pode te dar dicas preciosas de onde melhorar. Geralmente cai na regra de Pareto: os problemas mais críticos costumam estar em poucos pontos específicos (geralmente, claro, cada caso é um caso).

1

Rode sua função (vi nos comentários que vc vai usar Lambda) e veja o tempo de execução e uso de memoria nos logs do lambda. É sempre bom tirar uma média se varias execuções e em situações diversas.

Se julgar que tem alguma situação muito fora da média, ou que no geral está achando alto o tempo, use um Profiler para ver aonde está a lentidão/consumo de RAM, e só então otimize.