Posted on: July 03, 2025 03:48 PM
Posted by: Renato
Views: 441
Uma dica rápida para testes de desempenho.
Você pode medir facilmente o tempo de execução de um bloco de código com o auxiliar de benchmark Laravel ⏰
Benchmark no Laravel: Medindo Performance de Código
O Laravel oferece um helper Benchmark muito útil para medir o tempo de execução de blocos de código. Vamos analisar o exemplo fornecido e ver outros casos de uso.
..
use App\Models\User;
use Illuminate\Support\Benchmark;
Benchmark::dd(fn () => User::find(1)); // 0.1 ms
Benchmark::dd([
'Scenario 1' => fn () => User::count(), // 0.5 ms (consulta otimizada no banco)
'Scenario 2' => fn () => User::all()->count(), // 20.0 ms (carrega todos os modelos)
]);
Outros Exemplos Úteis
1. Comparando diferentes formas de consulta
use App\Models\Post;
'Eager Loading' => fn () => Post::with('comments')->get(),
'Lazy Loading' => fn () => Post::get()->load('comments'),
]);
2. Testando operações no banco vs coleções
use App\Models\Product;
'Database Where' => fn () => Product::where('price', '>', 100)->get(),
'Collection Filter' => fn () => Product::all()->filter(fn ($p) => $p->price > 100),
]);
3. Medindo tempo de processamento
php
// Processamento pesado
Benchmark::dd(fn () => collect(range(1, 10000))->map(fn ($n) => $n * 2)->filter(fn ($n) => $n % 3 === 0)->sum());
4. Comparando métodos de cache
php
use Illuminate\Support\Facades\Cache;
'Cache Remember' => fn () => Cache::remember('users', 3600, fn () => User::all()),
'Direct Access' => fn () => User::all(),
]);
5. Testando várias iterações
php
// Testa 100 iterações para ter uma média mais precisa
Benchmark::dd(
fn () => User::where('active', true)->get(),
iterations: 100
);
Métodos Disponíveis
Além de dd() que exibe e encerra a execução, você pode usar:
// Retorna o tempo sem encerrar a execução
$time = Benchmark::measure(fn () => User::count());
Benchmark::measureAndContinue(fn () => heavyOperation());
Dica: Use benchmarks para identificar gargalos de performance, especialmente ao comparar diferentes abordagens para resolver o mesmo problema.
Usando Benchmark em Testes Unitários no Laravel
Usar o helper Benchmark em testes unitários no Laravel para verificar a performance de partes do seu código. Embora testes unitários normalmente foquem em funcionalidade, benchmarks podem ser úteis para:
Exemplo Básico em Teste Unitário
php
use Tests\TestCase;
use App\Models\User;
use Illuminate\Support\Benchmark;
{
public function test_user_retrieval_performance()
{
User::factory()->create(); // Dados de teste
$time = Benchmark::measure(fn () => User::first());
$this->assertLessThan(5, $time, 'A consulta demorou mais de 5ms');
}
}
Casos de Uso Avançados
1. Teste de Limite de Performance
php
public function test_search_performance_with_many_records()
{
User::factory()->count(10000)->create();
$time = Benchmark::measure(
fn () => User::where('email', 'like', '%@example.com')->get(),
iterations: 10 // Executa 10 vezes para média
);
$this->assertLessThan(100, $time, 'Consulta de busca excedeu 100ms');
}
2. Comparação de Implementações
php
public function test_optimized_query_vs_collection()
{
$users = User::factory()->count(1000)->create();
$results = Benchmark::compare([
'Database Query' => fn () => User::active()->get(),
'Collection Filter' => fn () => User::all()->filter->isActive(),
]);
$this->assertLessThan(
$results['Database Query'],
$results['Collection Filter'],
'Filtro por coleção foi mais rápido que consulta no banco'
);
}
3. Teste de Carga Simples
php
public function test_heavy_operation_performance()
{
$time = Benchmark::measure(
fn () => $this->heavyCalculation(),
iterations: 5
);
$this->assertLessThan(500, $time, 'Operação pesada excedeu 500ms');
}
Dicas para Usar Benchmark em Testes
Use dados realistas: Crie factories com volumes similares à produção
Execute múltiplas iterações: Para evitar variações aleatórias
Isole os testes: Garanta que outros testes não afetem a performance
Considere o ambiente: Benchmarks podem variar entre local/CI/produção
Use para regressões: Compare com valores históricos aceitáveis
Exemplo Completo com Setup
php
use Tests\TestCase;
use App\Models\Order;
use Illuminate\Support\Benchmark;
{
protected function setUp(): void
{
parent::setUp();
Order::factory()->count(5000)->create(); // Pré-carrega dados
}
{
$maxAllowedTime = 200; // 200ms
$time = Benchmark::measure(function () {
// Código complexo de geração de relatório
return Order::with('customer')
->where('created_at', '>', now()->subMonth())
->orderBy('total')
->get()
->groupBy('customer.id');
});
$this->assertLessThan(
$maxAllowedTime,
$time,
"Geração de relatório excedeu {$maxAllowedTime}ms"
);
}
}
Lembre-se que benchmarks em testes devem ser usados com cuidado - eles podem tornar seus testes frágeis se dependem muito de tempos absolutos que variam entre ambientes.
..
Donate to Site
Renato
Developer