PHP e Performance, parte 1

PHP e Performance, parte 1

28/04/2016 Jonathan André Schweder 2 min de leitura

Algo que alguns criticam no PHP é questão de performance, sempre digo que PHP é uma linguagem performática para o que ele se propõe a fazer. Contudo, performance não é algo simples, existem centenas de milhares de fatores que podem interferir, começando pelo hardware usado até a alocação desnecessária de variáveis.

Pesquisando um pouco sobre, decidi fazer uma série de artigos falando sobre performance no PHP, dando algumas dicas de melhorias que todos podem adotar. Veja abaixo a primeira delas, o uso da função unset() para desalocar memória.

unset()

Para entender melhor o problema considere o seguinte código abaixo:

echo "Quantidade de memória usada antes " . memory_get_usage() . PHP_EOL;
$arr = array();
for ($i = 0; $i < 1000000; ++$i) {
  $arr[] = rand();
}
echo "Quantidade de memória usada depois " . memory_get_usage() . PHP_EOL;

Executando este programa algo como o texto abaixo deve ser mostrado:

Quantidade de memória usada antes 232888
Quantidade de memória usada depois 233368

Claro que os valores serão diferentes para cada ambiente, porém, nesse caso, a diferença de uso de memória é de 480 bytes, contudo podemos melhorar o uso de memória colocando manualmente a chamada da função “unset()”, veja:

echo "Quantidade de memória usada antes " . memory_get_usage() . PHP_EOL;
$arr = array();
for ($i = 0; $i < 1000000; ++$i) {
  $arr[] = rand();
}
unset($arr); // <- chamando unset()
echo "Quantidade de memória usada depois " . memory_get_usage() . PHP_EOL;

No caso dessa execução os valores foram os seguintes:

Quantidade de memória usada antes 232936
Quantidade de memória usada depois 233256

A diferença agora foi de 320 bytes, o que significa um uso de 33,3% a menos de memória, um ganho considerável com uma alteração simples.

Em linguagens que possuem um sistema de coleta de lixo ou do inglês “Garbage Collector”, existem pontos chaves durante a execução que executarão o coletor de lixo, no PHP isso acontece em três momentos, ao chamar a função “unset()”, ao final da execução de uma função e ao final da execução do programa. O tempo de execução é o mesmo nos três casos, pois todos chamam a função “unset()”, porém existe a vantagem que ao chamar manualmente você conseguirá liberar memória no meio da execução, diferente das outras alternativas.

Bom pessoal, essa dica foi rápida e simples, não há contra indicação, por fim, deixando um último ponto, a performance não deveria ser sua única e principal prioridade, deve ser levada em conta, porém, muito mais vale um código legível, funcional e de fácil manutenção do que um código totalmente performático. Até a próxima.