Pular para o conteúdo principal

Medindo o tempo do seu código

Uma das facilidades do padrão para o C++ moderno é a presença de construções que permitem a manipulação de data e tempo. Estes utilitários podem ser encontrados na biblioteca chrono, como você poderá conferir em algumas referências e documentações que se encontram disponíveis, como por exemplo, as minhas favoritas: Documentação do Visual C++, Cplusplus.com e Cppreference.com.

Neste post, vamos focar somente nos utilitários de tempo. O que você pode fazer com eles? É possível saber, através de um de seus relógios (system_clock, steady_clock, high_resolution_clock), sobre um determinado ponto de referência no tempo, como por exemplo, o “agora” através da função estática now.



Existe uma série de possibilidades e aplicações para estas classes de tempo, não acha? Uma delas é utilizar um relógio para medir dois pontos distintos no tempo, estabelecendo uma diferença, normalmente denominada de “delta T”. Conforme podemos ver no exemplo a seguir:

https://gist.github.com/8e925e30cde7f8c2fa40

O high_resolution_clock é ideal para esta tarefa, onde sua escala é baseada em ticks. No entanto, nós queremos saber de uma referência no tempo que possa ser reconhecida por seres humanos, e não numa escala conveniente à máquina, não é mesmo?

Para isso acontecer será necessário fazer um cast da diferença com a unidade de tempo desejada, ou seja, isto requer uma transformação:

https://gist.github.com/931f7d9505b4ea82bcd1

Com o duration_cast é possível fazer uma conversão da duração obtida através deste delta para diversas medidas de tempo conhecidas, incluindo segundos, milissegundos, microssegundos, entre outras.

Se você estiver acostumado com os “Stopwatches” existentes em outras bibliotecas para fazer esta tarefa de medição e se sente confortável com eles, porque não encapsular estas funcionalidades da biblioteca chrono no seu stop_watch caseiro (assim como fizemos e disponibilizamos a seguir)?

https://gist.github.com/3c76023a5da2a2c92dd3

Logo, você pode ter uma API sucinta e coveniente para a medição de funções, trechos ou blocos de código, que pode ser consumida da seguinte maneira:

https://gist.github.com/fabiogaluppo/5ee7f21996fbc364506e

Boa medição com C++ Moderno! ;-)

Fonte: https://github.com/SimplyCpp/examples/blob/master/stop_watch.cpp

Comentários

Postagens mais visitadas deste blog

Mestre Iota

Iota é a nona letra do alfabeto grego, ela é equivalente à letra i do nosso alfabeto. Por convenção ou hábito, utilizamos a letra i na programação para indicar algum tipo de incrementador, como por exemplo, em um for-loop . https://gist.github.com/fabiogaluppo/a23894ae743f7dd29274 Curiosamente, iota , como identificador, também é utilizado na programação para indicar uma sequência finita e consecutiva de números inteiros, como por exemplo, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. Inclusive, originalmente na STL existia a função iota , inspirada pela linguagem de programação APL , você pode conferir neste link: http://www.sgi.com/tech/stl/iota.html

Valores Aleatórios Simplificados

A partir do C++ 11, foi introduzido o header <random>  com diversos facilitadores para suporte de geração de números aleatórios. A produção destes números é feita através da combinação de duas categorias de objetos: os geradores e os distribuidores. Os geradores, são responsáveis pela geração dos números, e os distribuidores são responsáveis pela transformação dos números gerados em algum tipo de distribuição de probabilidade.  Como por exemplo, uma distribuição normal (aquela da Gaussiana) ou uma distribuição de Pareto (aquela do 80-20). As opções não faltam, como você pode ver nas referências, por exemplo:   http://www.cplusplus.com/reference/random/ ou  http://en.cppreference.com/w/cpp/header/random .

Policy-based design: log writer

Policy-based design Vamos neste artigo dar mais uma pincelada no Policy-based design . Vamos fazer como exemplo uma classe de log. Como este é só um exemplo, não vamos considerar múltiplos parâmetros no log, mas somente uma string, assim não fugiremos do assunto. Uma das coisas mais importantes neste tipo de design é o desacoplamento. Ele é uma excelente alternativa ao uso de interfaces por duas razões: Não gera chamadas virtuais (ou um nível de indireção em tempo de execução) Duck typing ( https://pt.wikipedia.org/wiki/Duck_typing ) Eu gosto bastante desse tipo de design, já usado aqui: http://simplycpp.com/2016/02/05/leitura-de-configuracao-em-c/