Uncategorized

php Medindo o tempo e memória de execução de uma página | Melhorando o desempenho com o Serialize

Estou trabalhando em um projeto que irá exibir um select com todas as cidades do Brasil. É provável que a solução mais comum fosse usar um autocomplete. Porem neste caso o site possui foco em otimização de desempenho o que inviabilizaria as várias requisições ao servidor de um autocomplete.

Logo foi identificado também um gargalo, ao selecionar as mais de 5.000 cidades unidas por um left join ao seus respectivos estados, a página demorava para carregar.

O ponto de partida desse script foi “medir” o tempo e memória consumidas pela página. Para isso foi usado esse script de luders.com.br, com as adaptações o código ficou:


// Iniciamos o "contador"
list($usec, $sec) = explode(' ', microtime());
$script_start = (float) $sec + (float) $usec;

require_once ‘./lib/config.php’;

$cidades = dbCidade::listar(“”, “”);

// Terminamos o “contador” e exibimos
list($usec, $sec) = explode(‘ ‘, microtime());
$script_end = (float) $sec + (float) $usec;
$elapsed_time = round($script_end – $script_start, 5);
echo ‘Elapsed time: ‘, $elapsed_time, ‘ secs. Memory usage: ‘, round(((memory_get_peak_usage(true) / 1024) / 1024), 2), ‘Mb’;

O dbCidade::listar executa um select de todos os campos de cidade + campos de estado. O resultado foi:

Elapsed time: 3.92842 secs. Memory usage: 54.25Mb

Então editei a função dbCidade::listar para usar a função serialize. Utilizo duas funções arquivoCriar e arquivoLer que criam e leem arquivos no sistema.


class dbCidade extends dataTable {
public static function listar() {
//Tenta ler o cache
$retorno = arquivoLer("cache/dbCidadeAll.cache");
if ($retorno) {
return unserialize($retorno);
}

$sql = “SELECT cidade.*, estado.regiao AS estado_regiao…….;

$dados = dataExecSqlDireto($Conexao, $sql, true);
arquivoCriar(serialize($dados), “cache/dbCidadeAll.cache”);
return $dados ;
}
}

A classe e a função listar foram simplificadas para facilitar a leitura. O resultado foi:

Elapsed time: 0.18529 secs. Memory usage: 45Mb

Uma diferença de 3.8 segundos no carregamento. Cabe lembrar que a primeira execução irá demorar. Também deve-se cuidar com cache infinito: dependendo da base de dados pode-se preencher facilmente 40 gb com cache, em especial quando o google bot achar seu sitemap.

Anúncios
Padrão

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s