Análise de algoritmos com perf e CPU profiling

Complexidade teórica vs prática

A notação assintótica ($O(n)$, $O(n\log\,n)$, $O(n^2)$) descreve crescimento.

Mas não descreve como o código realmente se comporta na CPU.

Dois algoritmos com a mesma complexidade podem ter desempenhos completamente diferentes dependendo de:

Aqui entra o perf.


O objetivo

A pergunta é simples:

Se a complexidade já descreve tudo, por que o comportamento real na CPU muda tanto?


Ferramenta usada: perf

O perf permite observar o que realmente acontece no hardware:

Isso transforma a análise de teórica para física.


Ambiente de execução


Algoritmos analisados

Todos executados sobre o mesmo conjunto de entrada.


Métricas analisadas

O perf stat foi usado com:


cycles
instructions
branch-misses

E o perfil detalhado via perf record + perf report.


Visão geral dos resultados

IPC (Instructions per Cycle)

Algoritmos eficientes:

Algoritmos $O(n²)$:

Importante: IPC alto não significa desempenho melhor. Ele só indica eficiência de pipeline.


Cache e memória

Merge Sort

Resultado:


Quick Sort

Apesar disso:


Bubble / Selection / Insertion Sort

Resultado:


Branch prediction

Algoritmos com muitos condicionais:

sofrem com:

Isso aparece diretamente no branch-misses.


Hotspots reais (perf report)

Os principais pontos de execução:

Em alguns casos:

mais de 90% do tempo fica concentrado em uma única função

Conclusão direta:

desempenho é sempre concentrado, nunca distribuído


O que os dados mostram

Mesmo com a mesma complexidade:


Complexidade vs realidade

A teoria responde:

quanto o algoritmo cresce

A CPU responde:

onde o tempo realmente está sendo gasto


Resultados com perf


Merge Sort

Hotspots:

comportamento dominado por memória


Quick Sort

Hotspots:

gargalo: previsibilidade de branches


Insertion Sort

Hotspot:

simples, mas extremamente ineficiente em escala


Selection Sort

Hotspot:

custo puramente $O(n²)$


Bubble Sort

Hotspot:

pior cenário clássico confirmado na prática


Optimized Bubble Sort

Hotspot:

otimização local irrelevante em termos assintóticos


Leitura geral dos dados

Algoritmos $O(n\log\,n)$

Algoritmos $O(n²)$


O ponto mais importante

A diferença real não é só a complexidade:

Cada algoritmo falha por um motivo diferente no hardware.


Conclusão

A complexidade continua correta.

Mas incompleta.

Na prática:


Síntese final

Dois algoritmos podem ter a mesma complexidade e comportamentos completamente diferentes na CPU.


Leitura complementar

Uma análise complementar explora o comportamento estatístico dos algoritmos de ordenação com múltiplas execuções, medindo variabilidade, desvio padrão e consistência dos tempos de execução. Você pode encontrá-la aqui.


Código

Você pode encontrar o projeto completo aqui.