Quero descobrir quanto tempo uma determinada função leva no meu programa C ++ para executar no Linux . Depois, quero fazer uma comparação de velocidade. Eu vi várias funções de tempo, mas acabei com isso do impulso. Crono:
process_user_cpu_clock, captures user-CPU time spent by the current process
Agora, não estou claro se eu uso a função acima, receberei o único tempo que a CPU gastou nessa função?
Em segundo lugar, não encontrei nenhum exemplo de uso da função acima. Alguém pode me ajudar como usar a função acima?
PS: No momento, estou usando std::chrono::system_clock::now()
para obter tempo em segundos, mas isso me dá resultados diferentes devido à carga de CPU diferente a cada vez.
c++
optimization
profiling
Xara
fonte
fonte
clock_gettime
.. gcc define outros relógios como:typedef system_clock steady_clock; typedef system_clock high_resolution_clock;
no Windows, useQueryPerformanceCounter
.Respostas:
É um método muito fácil de usar no C ++ 11. Você tem que usar
std::chrono::high_resolution_clock
do<chrono>
cabeçalho.Use-o assim:
Isso medirá a duração da função.
NOTA: Você nem sempre terá o mesmo tempo para uma função. Isso ocorre porque a CPU da sua máquina pode ser menos ou mais usada por outros processos em execução no seu computador, assim como sua mente pode estar mais ou menos concentrada quando você resolve um exercício de matemática. Na mente humana, podemos lembrar a solução de um problema de matemática, mas para um computador o mesmo processo sempre será algo novo; assim, como eu disse, você nem sempre obterá o mesmo resultado!
fonte
high_resolution_clock
lhe dará o tempo físico e real que a sua função leva para executar. Portanto, em sua primeira execução, sua CPU estava sendo usada menos do que na próxima execução. Por "usado", quero dizer que outro trabalho de aplicativo usa a CPU.steady_clock
? Não é possívelhigh_resolution_clock
que seja um relógio não monotônico?Aqui está uma função que medirá o tempo de execução de qualquer função passada como argumento:
Exemplo de uso:
Resultado:
fonte
high_resolution_clock
pode ser um pseudônimo desystem_clock
(relógio de parede)steady_clock
ou um terceiro relógio independente. Veja detalhes aqui . Para relógio da CPU,std::clock
pode ser usadowindows.h
em um projeto c ++ não trivial. Emassert
primeiro lugar: "quod licet iovi non licet bovi";). Segundo, nem todas as decisões na biblioteca padrão (às vezes datam de décadas) são realmente consideradas uma boa idéia pelos padrões modernos. Há uma razão pela qual o designer de módulos do c ++ se esforça muito para não exportar macros por padrão.programa simples para encontrar o tempo de execução de uma função.
fonte
No livro de Scott Meyers, encontrei um exemplo de expressão lambda genérica universal que pode ser usada para medir o tempo de execução da função. (C ++ 14)
O problema é que você mede apenas uma execução para que os resultados possam ser muito diferentes. Para obter um resultado confiável, você deve medir um grande número de execução. De acordo com a palestra de Andrei Alexandrescu na conferência code :: dive 2015 - Writing Fast Code I:
Tempo medido: tm = t + tq + tn + a
Onde:
tm - tempo medido (observado)
t - o tempo real de interesse
tq - tempo adicionado pelo ruído de quantização
tn - tempo adicionado por várias fontes de ruído
tempo de overhead (funções de medição, loop, chamada)
De acordo com o que ele disse mais adiante na palestra, você deve ter no mínimo esse grande número de execuções como resultado. Encorajo-vos a olhar para a palestra em que ele explica o porquê.
Também há uma biblioteca muito boa do google - https://github.com/google/benchmark . Esta biblioteca é muito simples de usar e poderosa. Você pode conferir algumas palestras de Chandler Carruth no youtube, onde ele está usando esta biblioteca na prática. Por exemplo, CppCon 2017: Chandler Carruth “Indo a lugar nenhum mais rápido”;
Exemplo de uso:
EDIT: Claro que você sempre precisa se lembrar de que seu compilador pode otimizar algo ou não. Ferramentas como perf podem ser úteis nesses casos.
fonte
Maneira fácil para C ++ mais antigo ou C:
A precisão do tempo em segundos é
1.0/CLOCKS_PER_SEC
fonte
Por exemplo, para encontrar todos os números primos entre 1 e 100 milhões, leva aproximadamente 1 minuto e 40 segundos. Portanto, o tempo de execução é impresso como:
O código está aqui:
fonte
Aqui está um excelente modelo de classe apenas de cabeçalho para medir o tempo decorrido de uma função ou qualquer bloco de código:
Aqui estão alguns usos dele:
Como a classe é um modelo, podemos especificar com facilidade como queremos que nosso tempo seja medido e exibido. Este é um modelo de classe de utilidade muito útil para fazer marcações em bancada e é muito fácil de usar.
fonte
stop()
função de membro não é necessária porque o destruidor interrompe o cronômetro para você.test code
iniciar o cronômetro. Depois,test code
você explicitamente usa o objeto timer e chama seu método stop. Você precisa invocá-lo manualmente quando quiserstop
o cronômetro. A classe não aceita nenhum parâmetro. Além disso, se você usou essa classe, como mostrei, verá que há um tempo mínimo entre a chamadaobj.stop
e a chamadadestructor
.<chrono>
?Eu recomendo usar o
steady_clock
que é garantido para ser monotônico, ao contráriohigh_resolution_clock
.Resultado:
fonte
Você pode ter uma classe simples que pode ser usada para esse tipo de medida.
A única coisa que você precisa fazer é criar um objeto em sua função no início dessa função.
e é isso. A classe pode ser modificada para atender às suas necessidades.
fonte
Como nenhuma das respostas fornecidas é muito precisa ou fornece resultados reproduzíveis, decidi adicionar um link ao meu código que possui precisão de menos de nanossegundos e estatísticas científicas.
Observe que isso funcionará apenas para medir o código que leva um tempo (muito) curto para ser executado (ou seja, alguns ciclos de relógio para alguns milhares): se eles executarem tanto tempo que provavelmente serão interrompidos por alguma interrupção -heh- , claramente não é possível fornecer um resultado reproduzível e preciso; a conseqüência disso é que a medição nunca termina: ou seja, continua a medir até ter estatisticamente 99,9% de certeza de que possui a resposta certa, o que nunca acontece em uma máquina que possui outros processos em execução quando o código demora muito.
https://github.com/CarloWood/cwds/blob/master/benchmark.h#L40
fonte
Se você deseja economizar tempo e linhas de código, pode tornar a medição do tempo de execução da função uma macro de uma linha:
a) Implemente uma classe de medição de tempo, como já sugerido acima (aqui está minha implementação para o Android):
b) Adicione uma macro conveniente que use o nome da função atual como TAG (usar uma macro aqui é importante; caso contrário,
__FUNCTION__
será avaliado emMeasureExecutionTime
vez da função que você deseja medirc) Escreva sua macro no início da função que você deseja medir. Exemplo:
O que resultará na seguinte saída:
Observe que isso (como todas as outras soluções sugeridas) medirá o tempo entre o momento em que sua função foi chamada e quando ela retornou, não necessariamente o tempo em que sua CPU estava executando a função. No entanto, se você não alterar o agendador para suspender o código em execução chamando sleep () ou similar, não há diferença entre eles.
fonte