Função gettimeofday() no PHP: Array de Tempo e Performance

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()?

O que é a gettimeofday() no PHP?
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. 0 significa "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:

Array (
[sec] => 1551025438
[usec] => 880119
[minuteswest] => 180
[dsttime] => 0
)
💡 Dica de Mestre: Veja que o [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!

Pare de Escrever Códigos Lentos que Derrubam Servidores ⚡

"Eu não sabia por que meu sistema na AWS estava tão caro. A apostila me ensinou a pensar na performance desde a primeira linha de código, usando arrays e laços de forma inteligente!" - Carlos M., Analista de Sistemas.

Entender como o PHP processa os dados em microssegundos separa os amadores dos engenheiros de software. Se você quer parar de copiar tutoriais genéricos e aprender a fundo como construir lógicas sólidas, adquira a Apostila Oficial de PHP Progressivo. Estude a arquitetura da linguagem, offline, sem anúncios piscando na tela, e eleve seu nível técnico para assumir vagas de peso!

📥 Baixar Apostila PHP Progressivo em PDF
Capa digital da Apostila PHP Progressivo com fundo transparente

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:

  1. Marca d'água inicial: Registre o exato instante antes do script complexo começar (Tempo 1).
  2. O Processamento: Execute o código, banco de dados, laços for ou integrações de API.
  3. 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!

⚠️ Alerta Sênior (Mercado de Trabalho): Embora a lógica matemática ensinada acima seja perfeita e funcional, usar 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!

Mega Pack completo do Projeto Progressivo contendo apostilas de PHP, Java, C e Front-end

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:


Perguntas Frequentes (FAQ) da Comunidade

O que significa a notação "E-7" no resultado do tempo do script?

A letra "E" indica Notação Científica Exponencial. Quando o PHP retorna algo como 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?

Para o mercado corporativo atual, você deve preferir sempre a 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: