Pular para conteúdo

Projeto 05: Benchmark e Comparativo Multiparadigma na Prática ⚖️

Escopo do Projeto

Objetivo: Desenvolver um benchmark científico comparando uma mesma aplicação crítica de negócio (Processamento de Pedidos) sob os três paradigmas (Estruturado, OO e Funcional), mensurando consumo de memória e tempo de execução.


🎯 1. Contexto & Desafio Prático

Qual paradigma é mais eficiente para o seu caso de uso? Para responder a essa questão com fundamentação de engenharia, você construirá um harness de benchmark que processa 100.000 pedidos, registrando a taxa de Throughput e o perfil de alocação de memória de cada abordagem.


📋 2. Requisitos Técnicos Obrigatórios

  • R1 (Massa de Dados Sintética): Gerar lote de 100.000 pedidos com campos: id, cliente, status e lista de itens com preços.
  • R2 (Três Implementações Isoladas): Executar o mesmo fluxo de regras (filtrar pedidos pagos, aplicar imposto e totalizar faturamento) nos 3 paradigmas.
  • R3 (Medição de Tempo e Memória): Utilizar time.perf_counter() e tracemalloc para capturar tempo de CPU e pico de consumo de RAM.
  • R4 (Gráfico ou Tabela de Resultados): Gerar relatório conclusivo apontando quando cada paradigma é preferível.

📐 3. Diagrama Conceitual & Arquitetura

graph TD
    Data["Lote: 100.000 Pedidos Sintéticos"] --> Benchmark["Harness de Benchmark (tracemalloc + perf_counter)"]
    Benchmark --> RunImp["Execução 1: Estruturado (Iterativo)"]
    Benchmark --> RunOO["Execução 2: Orientado a Objetos (Classes)"]
    Benchmark --> RunFunc["Execução 3: Funcional (Generators / Streams)"]
    RunImp & RunOO & RunFunc --> Report["Tabela Comparativa de Latência e Memória"]
    style Data fill:#e1f5fe,stroke:#01579b
    style Benchmark fill:#fff3e0,stroke:#e65100
    style Report fill:#e8f5e9,stroke:#2e7d32

💻 4. Especificação Técnica & Código de Referência

// benchmark_paradigmas.py
import time
import tracemalloc

def benchmark_runner(nome: str, func, dados):
    tracemalloc.start()
    start_time = time.perf_counter()

    resultado = func(dados)

    elapsed = time.perf_counter() - start_time
    current, peak = tracemalloc.get_traced_memory()
    tracemalloc.stop()

    print(f"[{nome:12}] Tempo: {elapsed*1000:6.2f}ms | Pico Memória: {peak / 1024:6.2f} KB | Total: {resultado:.2f}")

📦 5. Critérios de Avaliação e Entrega

  1. Script executando sem falhas para 100.000 registros.
  2. Tabela com dados de tempo (ms) e memória (KB) para as 3 abordagens.
  3. Análise crítica dos trade-offs observados.