Como Usar gettimeofday() no PHP: Medindo o Tempo e a Performance do seu Sistema
O Cronômetro do Back-end: Por que os microssegundos importam?
Na vida real, um segundo passa num piscar de olhos. Mas para um processador rodando um servidor web de um grande e-commerce, um segundo é uma eternidade. Se o seu código PHP demorar "alguns segundinhos" para responder, o usuário abandona o carrinho de compras, a API externa dá timeout e o seu servidor trava por excesso de requisições encavaladas.
Neste cenário de alta performance, manipular datas em dias ou horas não é suficiente. Nós precisamos mergulhar na escala microscópica do tempo. É aqui que entra a função nativa gettimeofday(), uma herança direta da linguagem C para os sistemas baseados em Unix.
Para que serve a função gettimeofday()?
A função gettimeofday() no PHP é utilizada para capturar o instante exato do sistema com altíssima precisão. Por padrão, ela retorna um array associativo contendo os segundos decorridos desde a Unix Epoch, a fração exata de microssegundos atuais, além de informações locais sobre o fuso horário (minutos a oeste de Greenwich) e o horário de verão.
Ao chamarmos a função simplesmente como gettimeofday(), o motor do PHP nos devolve um array associativo com os seguintes 4 elementos preciosos:
- [sec]: O número de segundos cravados desde a Unix Epoch (01/01/1970).
- [usec]: A fração de microssegundos atual do exato momento em que a função rodou (1 segundo = 1.000.000 de microssegundos).
- [minuteswest]: Quantos minutos o fuso horário do servidor está a oeste do meridiano de Greenwich (GMT). Útil para registrar logs em servidores Cloud globais.
- [dsttime]: Um número inteiro que representa o tipo de Horário de Verão (Daylight Saving Time) aplicado na região.
0significa "Sem horário de verão",1é o dos EUA, e assim por diante.
<?php
// Obtendo o array de tempo completo do servidor
$tempo_sistema = gettimeofday();
// Printando a estrutura na tela para depuração
echo "<pre>";
print_r($tempo_sistema);
echo "</pre>";
?>
Dependendo da configuração do seu servidor no momento da execução, o resultado será algo parecido com isto:
[sec] => 1551025438
[usec] => 880119
[minuteswest] => 180
[dsttime] => 0
)
[minuteswest] me retornou 180. Se dividirmos 180 por 60 minutos, temos 3 horas. Como o Brasil (Horário de Brasília) está 3 horas atrás do GMT, faz total sentido estarmos "180 minutos a oeste"! Deixe nos comentários qual valor apareceu no seu teste!
O Retorno em Float: gettimeofday(TRUE)
Se você precisa apenas do tempo para fazer cálculos matemáticos, lidar com um Array de 4 posições dá trabalho desnecessário. O PHP foi camarada e adicionou um atalho:
Se você passar o parâmetro booleano TRUE na chamada, como gettimeofday(TRUE), a função muda seu comportamento. Ela abandona o array e passa a retornar um único número Float (ponto flutuante). Este número aglutina os segundos da Unix Epoch com os microssegundos nas casas decimais.
<?php
// Pegando apenas o tempo absoluto em Float
$tempo_float = gettimeofday(TRUE);
echo "Instante exato computacional: " . $tempo_float;
// Saída esperada: 1551025529.2385
?>
Exercício: Medindo o Tempo de Execução de um Script (Benchmarking)
A principal aplicação real de se capturar microssegundos no desenvolvimento back-end é realizar testes de estresse e descobrir qual parte do seu código está lenta. A lógica universal para isso (conhecida como Benchmarking) segue 3 passos:
- Marca d'água inicial: Registre o exato instante antes do script complexo começar (Tempo 1).
- O Processamento: Execute o código, banco de dados, laços
forou integrações de API. - Marca d'água final: Registre o instante logo após o término (Tempo 2).
O tempo de execução total é, matematicamente falando, a diferença absoluta: Tempo Final - Tempo Inicial.
<?php
// 1. Pegamos a "fotografia" do tempo inicial
$d1 = gettimeofday(TRUE);
// 2. Nosso script (aqui, apenas um print hiper rápido)
echo "Olá mundo, estou sendo processado!<br />";
// 3. Pegamos a "fotografia" do tempo final
$d2 = gettimeofday(TRUE);
// 4. Calculamos a diferença de performance
$tempo_total = $d2 - $d1;
echo "Tempo de execução: " . $tempo_total . " segundos.";
?>
O resultado na sua tela provavelmente será um número em notação científica (algo como 9.5367431640625E-7). Isso significa 0,000000954 segundos. Sim, o interpretador do PHP é brutalmente rápido para operações simples!
gettimeofday() para testes de performance é considerado um padrão legado (antigo) em equipes de engenharia modernas. Hoje em dia, a função recomendada e mais leve exclusivamente para medição de scripts é a microtime(true). Ela faz exatamente a mesma coisa, mas de forma muito mais otimizada!
⚙️ Simulador de Benchmarking em Tempo Real
Para você visualizar como o cálculo de Tempo Final menos Tempo Inicial funciona, criei um script JavaScript abaixo. Ao clicar no botão, ele marca o tempo, executa um laço forçado simulando um banco de dados pesado, marca o tempo final e exibe a demora.
Teste de Estresse na sua CPU
Vamos simular um script que gera 5 milhões de contas matemáticas e medir os milissegundos:
Evolua de Iniciante para Full-Stack Preparado 🚀
O mercado de tecnologia não perdoa códigos lentos. Para ser disputado pelas melhores empresas, você precisa dominar múltiplas linguagens e entender a lógica profunda dos algoritmos. Leve a biblioteca definitiva com o Mega Pack Completo: 7 Apostilas Premium do Projeto Progressivo. Domine C, Java, PHP e Front-end em um só pacote!
Consolide seu Conhecimento (O que estudar a seguir)
Nenhum conceito vive isolado na engenharia de software. Para fixar como medimos performance e estruturamos dados em PHP, recomendo as leituras complementares:
- A Origem dos Segundos: Entenda o que é a chave
[sec]do nosso retorno mergulhando na aula sobre A Função mktime() e a Unix Epoch. - Entendendo as Estruturas: Se o conceito de "chaves" te confundiu, você precisa voltar à base e ler o tutorial fundamental sobre O que são Arrays no PHP e como manipulá-los.
- Documentação Oficial: Leia a ficha técnica com os detalhes avançados no Manual do PHP para a função gettimeofday.
Perguntas Frequentes (FAQ) da Comunidade
O que significa a notação "E-7" no resultado do tempo do script?
9.53E-7, ele está avisando que o número é tão pequeno que não cabe na tela de forma amigável. Matematicamente, isso significa deslocar a vírgula 7 casas decimais para a esquerda, resultando em 0.000000953 segundos. Isso prova o quão veloz o núcleo em C do PHP processa funções básicas.
Devo usar gettimeofday(true) ou microtime(true) para medir performance?
microtime(true). Embora a função gettimeofday() cumpra muito bem o papel matemático (por razões de compatibilidade com sistemas Unix antigos), a microtime é o padrão de mercado estabelecido para benchmarking no PHP, sendo a sintaxe esperada pelos desenvolvedores seniores ao auditar tempos de execução.
Nenhum comentário:
Postar um comentário