- ❌ Evitar: Adicionar otimizações complexas antes de identificar gargalos reais
- ✅ Fazer: Implementar funcionalidades simples e medir performance quando necessário
- ✅ Fazer: Questionar cada "otimização" se realmente é necessária
- ❌ Evitar: Misturar testes funcionais com testes de performance
- ✅ Fazer: Testes funcionais devem ser rápidos (<1s) e focados em correção
- ✅ Fazer: Testes de performance devem ser separados em grupos
@group performance
- ❌ Evitar: Timeouts extremos (>30s) para mascarar problemas arquiteturais
- ✅ Fazer: Timeouts que refletem expectativas reais de produção
- ✅ Fazer: Investigar e corrigir a causa raiz quando timeouts precisam ser aumentados
// 598 linhas de configuração para um microframework
// 40+ configurações, 3 perfis, circuit breakers, etc.
HighPerformanceMode::enable(HighPerformanceMode::PROFILE_EXTREME);// 70 linhas, 3 perfis simples, foco no essencial
SimplePerformanceMode::enable(SimplePerformanceMode::PROFILE_PRODUCTION);// NO: Teste que mistura funcionalidade + performance
public function testHighPerformanceModeWithRealWorkload() {
// 50 requests em loop
// Assertions de timing
// Verificações funcionais
}// Teste funcional (rápido)
public function testHighPerformanceModeIntegration() {
// Verifica se funciona, não quão rápido
}
// Teste de performance (separado)
/**
* @group performance
*/
public function testHighPerformanceModeRealPerformance() {
// Foca apenas em métricas de performance
}SimplePerformanceMode::enable(SimplePerformanceMode::PROFILE_DEVELOPMENT);
// - Sem pooling (overhead desnecessário)
// - Logs detalhados
// - Debugging ativoSimplePerformanceMode::enable(SimplePerformanceMode::PROFILE_TEST);
// - Todas as otimizações desabilitadas
// - Foco na velocidade de execução dos testes
// - Sem overhead de monitoramentoSimplePerformanceMode::enable(SimplePerformanceMode::PROFILE_PRODUCTION);
// - Apenas otimizações comprovadamente úteis
// - Pooling básico (não extremo)
// - Monitoring essencial- ✅ Aplicação com >1000 req/s sustentados
- ✅ Necessidade comprovada de distributed pooling
- ✅ Equipe experiente em high-performance systems
- ✅ Microframework para APIs simples
- ✅ Aplicações com <500 req/s
- ✅ Foco em simplicidade e manutenibilidade
- ✅ Equipe prefere código claro a otimizações complexas
// Se você precisa disso, há problema arquitetural
$this->assertLessThan(60.0, $duration); // 60 segundos!// 40+ configurações para um framework "micro"
'scale_threshold' => 0.5,
'scale_factor' => 2.5,
'shrink_threshold' => 0.2,
'circuit_threshold' => 200,
'activation_threshold' => 0.8,- Circuit breakers para APIs simples
- Distributed pooling para <100 req/s
- Load shedding antes de medir carga real
- ✅ Testes funcionais: <1s cada
- ✅ Testes de integração: <5s cada
- ✅ Testes de performance: separados em grupos
- ✅ Classes de configuração: <100 linhas
- ✅ Microframework core: <50 classes
- ✅ Zero dependencies desnecessárias
- ✅ Startup time: <10ms
- ✅ Simple request: <1ms
- ✅ Memory footprint: <10MB
O objetivo de um microframework é simplicidade. Otimizações complexas devem ser:
- Justificadas por métricas reais
- Opcionais e não por padrão
- Documentadas com casos de uso específicos
- Testadas separadamente dos testes funcionais
Lembre-se: É melhor ter código simples e correto que código "otimizado" e complexo.