0Pricing
C++ Academy · Aula

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

  1. Durações e relógios
  2. Pontos no tempo
  3. Medição do desempenho do código
  4. Calendário e fusos horários
← Voltar para C++ Academy