Medição do desempenho do código
Faça benchmarks com chrono
Medição do desempenho do código é uma aula grátis de C++ Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C++ Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C++ Academy inclui 4 aulas no total.
Por que avaliar o desempenho
Medir quanto tempo o código leva para ser executado ajuda a encontrar gargalos e verificar otimizações. Com <chrono>, você obtém medições de tempo portáveis e seguras quanto aos tipos.
- Meça antes de otimizar.
- Use um relógio estável para obter intervalos confiáveis.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto start = steady_clock::now();
auto end = steady_clock::now();
std::cout << "Timed a block: " << ((end - start).count() >= 0) << '\n';
return 0;
}O padrão básico
O padrão de avaliação de desempenho é sempre o mesmo: capture now() antes do trabalho, execute-o, capture now() depois e subtraia.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto start = steady_clock::now();
long sum = 0;
for (int i = 0; i < 100000; ++i) sum += i;
auto end = steady_clock::now();
std::cout << "Sum: " << sum << ", elapsed >= 0: " << ((end - start).count() >= 0) << '\n';
return 0;
}Escolhendo a unidade
Escolha a unidade adequada à carga de trabalho. Use microseconds ou nanoseconds para laços rápidos e milliseconds para tarefas maiores.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto start = steady_clock::now();
long sum = 0;
for (int i = 0; i < 500000; ++i) sum += i;
auto end = steady_clock::now();
auto us = duration_cast<microseconds>(end - start);
std::cout << "Result: " << sum << ", us non-negative: " << (us.count() >= 0) << '\n';
return 0;
}Medição com ponto flutuante
Para obter segundos legíveis com frações, use uma duration<double> para preservar a precisão inferior a um segundo.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto start = steady_clock::now();
long sum = 0;
for (int i = 0; i < 200000; ++i) sum += i % 7;
auto end = steady_clock::now();
duration<double> secs = end - start;
std::cout << "Computed " << sum << ", seconds >= 0: " << (secs.count() >= 0) << '\n';
return 0;
}Um cronômetro reutilizável
Encapsule o padrão em um pequeno auxiliar para medir o tempo de qualquer objeto chamável de forma simples e evitar repetir código.
#include <iostream>
#include <chrono>
long long timeWork() {
using namespace std::chrono;
auto s = steady_clock::now();
long acc = 0;
for (int i = 0; i < 100000; ++i) acc += i;
auto e = steady_clock::now();
return duration_cast<microseconds>(e - s).count();
}
int main() {
std::cout << "Microseconds non-negative: " << (timeWork() >= 0) << '\n';
return 0;
}Evitando a eliminação de código morto
Os compiladores podem excluir trabalhos cujo resultado não é utilizado, arruinando as avaliações de desempenho. Sempre consuma o resultado, por exemplo, imprimindo-o ou acumulando-o em uma variável observável.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto s = steady_clock::now();
volatile long sink = 0;
for (int i = 0; i < 100000; ++i) sink += i;
auto e = steady_clock::now();
std::cout << "Sink used: " << (sink > 0) << ", elapsed >= 0: " << ((e - s).count() >= 0) << '\n';
return 0;
}Execuções de aquecimento
A primeira execução pode ser mais lenta devido aos caches e à inicialização tardia. Faça uma passagem de aquecimento antes de medir para obter números mais estáveis.
#include <iostream>
#include <chrono>
long work() {
long a = 0;
for (int i = 0; i < 50000; ++i) a += i;
return a;
}
int main() {
using namespace std::chrono;
work();
auto s = steady_clock::now();
long r = work();
auto e = steady_clock::now();
std::cout << r << " measured, ok: " << ((e - s).count() >= 0) << '\n';
return 0;
}Calculando a média de várias execuções
Uma única medição é sujeita a ruído. Execute o trabalho muitas vezes, some as durações decorridas e divida para obter uma média estável.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
long long total = 0;
const int runs = 5;
for (int r = 0; r < runs; ++r) {
auto s = steady_clock::now();
long acc = 0;
for (int i = 0; i < 100000; ++i) acc += i;
auto e = steady_clock::now();
total += duration_cast<microseconds>(e - s).count();
}
std::cout << "Average us non-negative: " << ((total / runs) >= 0) << '\n';
return 0;
}Comparação de duas abordagens
A avaliação de desempenho é especialmente útil ao comparar implementações. Cronometre cada uma da mesma forma e compare as durações resultantes.
#include <iostream>
#include <chrono>
#include <vector>
int main() {
using namespace std::chrono;
std::vector<int> v;
auto s1 = steady_clock::now();
for (int i = 0; i < 10000; ++i) v.push_back(i);
auto e1 = steady_clock::now();
v.clear();
v.reserve(10000);
auto s2 = steady_clock::now();
for (int i = 0; i < 10000; ++i) v.push_back(i);
auto e2 = steady_clock::now();
std::cout << "Both timed: " << (((e1 - s1).count() >= 0) && ((e2 - s2).count() >= 0)) << '\n';
return 0;
}Atenção à resolução
Se o trabalho medido for mais curto que o intervalo do relógio, poderá obter zero. Repita o trabalho vezes suficientes para ultrapassar a resolução do relógio.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto s = steady_clock::now();
int x = 1 + 1;
auto e = steady_clock::now();
auto ns = duration_cast<nanoseconds>(e - s).count();
std::cout << "x=" << x << ", tiny work may read low: " << (ns >= 0) << '\n';
return 0;
}Apresentação dos resultados
Converta a duração final para uma unidade legível e mostre-a. Mantenha o resultado consumido visível para que o otimizador não possa remover o trabalho.
#include <iostream>
#include <chrono>
int main() {
using namespace std::chrono;
auto s = steady_clock::now();
long acc = 0;
for (int i = 0; i < 300000; ++i) acc += (i * 3) % 11;
auto e = steady_clock::now();
auto ms = duration_cast<milliseconds>(e - s).count();
std::cout << "acc=" << acc << ", ms >= 0: " << (ms >= 0) << '\n';
return 0;
}Verificação rápida
Verifique sua compreensão das armadilhas da avaliação de desempenho.
Recapitulação
Você aprendeu a avaliar o desempenho do código com <chrono>:
- capture
steady_clock::now()antes e depois, e subtraia os valores - escolha uma unidade apropriada com
duration_cast - aqueça o código, calcule a média de várias execuções e consuma os resultados para impedir a eliminação de código morto
- tenha cuidado com a resolução do relógio em cargas de trabalho pequenas
Em seguida, você explorará os tipos de calendário e fuso horário do C++20.
Perguntas Frequentes
A aula “Medição do desempenho do código” é grátis?
Sim — o texto completo de “Medição do desempenho do código” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C++ Academy, atualize para CoddyKit PRO. O curso de C++ Academy inclui 4 aulas no total.
O que vou aprender em “Medição do desempenho do código”?
Faça benchmarks com chrono Você pratica C++ Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C++ Academy?
Nenhuma experiência prévia é necessária. C++ Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Medição do desempenho do código”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C++ Academy?
Sim. Cada aula de C++ Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Durações e relógios
- Pontos no tempo
- Medição do desempenho do código
- Calendário e fusos horários