Otimização, Otimização, Otimização…

Postado por Abraão Levi Oliveira Figueredo em 28 de agosto de 2010

Otimização é algo importe para qualquer pessoa e principalmente no meio tecnológico.

Em matemática, o termo otimização, ou programação matemática, refere-se ao estudo de problemas em que se busca minimizar ou maximizar uma função através da escolha sistemática dos valores de variáveis reais ou inteiras dentro de um conjunto viável.

- Wikipédia

Velocidade e otimizaçãoPodemos verificar isso usando um exemplo simples e claro: a questão do celular. Como era um celular a cerca de uma década atrás? Quem tinha um celular nessa época?

Pois bem, o celular era um trambolho grande, pesado, que nem ligações (função para o qual ele foi designado) faziam direito, por conta de interferências e falta de sinal. Com o passar do tempo tudo isso foi otimizado!

Com novas tecnologias, foram integrados processadores menores e mais rápidos, como consequencia o tamanho (espaço físico, assim como o peso) diminuiu, novas funcionalidades foram implementadas (um celular de 10 ou 15 anos atrás mal fazia ligações, hoje temos games, aplicativos e até Internet no bichinho).

A produção em massa (isso mesmo! otimização também no processo de produção) proporcionou uma gigantesca queda no preço, imagine que um celular chegou a custar US$4000 e hoje com US$50 é possível comprar algo que podemos chamar de “minicomputadorzinho” de bolso, que além de fazer sua principal função (se é que um smartphone hoje ainda tem como função principal fazer ligações) dezenas de vezes melhor que seus pais trambolhões, ainda têm funções extras (aplicativos, etc.)

Evolução do celular

Onde eu quero chegar com isso?

Tudo pode ser otimizado e melhorado, e a cada dia eu vejo mais essa necessidade, principalmente na área de desenvolvimento de software e aplicativos.

Um exemplo prático disso é diminuição de recursos de processamentos de um algoritmo e para esse exemplo vou utilizar um algoritmo que leia um numero e me diga se este numero é primo ou não. Vamos às definições:

Um número natural é um número primo quando ele tem exatamente dois divisores: o número um e ele mesmo, ou seja, é divisível por um ou por ele mesmo.

Sabendo disto, então para se obter a informação se o numero é primo ou não temos que percorrer o divisor e verificar se o resto da divisão corresponde a 0 (zero), se por algum momento isso acontecer é porque o numero não é primo. Digamos que a variável $numero receba seu valor de uma origem qualquer (através de um post, um get, um ajax ou de uma entrada de dados padrão).

 
$ehPrimo = true;
 
if($numero < 2){
	$ehPrimo = false;
}
else{
	for($i = 3; $i <= ($numero - 1); $i++){
	     if($numero % $i == 0) $ehPrimo = false;
        }
}
 
if($ehPrimo == false){
	echo “não é primo”;
}
else{
	echo “é primo”;
}

O algoritmo acima cumpre seu objetivo! Mas não da maneira mais otimizada… Pensando nisso vamos listar uma série de coisas que poderiam melhorar isso:

• Se o resto da divisão for igual a 0 (zero), então por consequencia um numero par, com exceção do 2, nunca irá ser primo. Então podemos eliminá-lo no primeiro condicional e evitar que a estrutura de repetição seja executada.

• No loop for, sabendo que a variável $ehPrimo entrou no estado de false, não há mais a necessidade de continuar o laço, poderiamos utilizar um break, mas existe estruturas de repetição mais adequada para essa situação, como o while.

• Pensando matematicamente, se pegarmos o intervalo de numeros divisores for multiplo de algum anterior, sabemos que seu resto será o mesmo (ex. o número 12, é o mesmo que 1*12, 2*6, 3*4, 4*3, 6*2, 12*1 – sabendo disso é necessário calcular somente até a raiz de um numero para evitar redundâncias)

O código mais otimizado ficaria mais ou menos assim:

$ehPrimo = true;
 
if($numero < 2 || (($numero % 2 == 0) && ($numero < 2))){
	$ehPrimo = false;
}
else{
	$i = 3;
	while($ehPrimo && ($i * $i <= $numero))
	{
	      if($numero % $i == 0) $ehPrimo = false;
        }
}
 
if($ehPrimo == false){
	echo “não é primo”;
}
else{
	echo “é primo”;
}

Conclusão

Apesar que no inicio isso possa parecer difícil ou não “apresentar” resultados em pequenos sistemas locais, isso causa grandes diferenças sistemas on-line ou que estão na cloud, por economizar processamento. Outro exemplo também, como no Java ou no c#, que possui dois tipo de variáveis de ponto flutuante o float (4 bytes) e o double (8 bytes), se você realmente não for precisar da precisão do double, pense que você esta usando o dobro de memória, imagine isso é um sistema com inúmeras variáveis e um numero interminável de linhas de código.

Então é isso! Até a próxima!



Compartilhe:

Sobre: Abraão Levi Oliveira Figueredo

Desenvolvedor web do Kekanto um guia colaborativo de Restaurantes, Bares, Baladas. Acredita em idéias simples e usabilidade. Sigam @AbraaoLevi

Comentários

Sem Comentários

Deixe um Comentário!

Nome: ( necessário )

E-Mail: ( necessário )

Website:

Comentário: