- Como obtenho o tempo de execução de um método?
- Existe uma
Timer
classe de utilidade para coisas como tempo quanto tempo uma tarefa leva, etc?
A maioria das pesquisas no Google retorna resultados para temporizadores que agendam threads e tarefas, o que não é o que eu quero.
java
timing
execution-time
Salmo Ogro33
fonte
fonte
Instant
classe: stackoverflow.com/a/30975902/1216775Respostas:
Sempre existe a maneira antiquada:
fonte
Eu vou com a resposta simples. Funciona para mim.
Funciona muito bem. Obviamente, a resolução é de apenas milissegundos; você pode fazer melhor com System.nanoTime (). Existem algumas limitações para ambos (fatias de agendamento do sistema operacional, etc.), mas isso funciona muito bem.
Média em algumas corridas (quanto mais, melhor) e você terá uma idéia decente.
fonte
nanoTime
é garantido que seja pelo menos tão resoluto quantocurrentTimeMillis
. docs.oracle.com/javase/7/docs/api/java/lang/…currentTimeMillis
disso é que é um carimbo de data / hora real e pode ser usado para registrar também os horários de início / término, enquantonanoTime
"só pode ser usado para medir o tempo decorrido e não está relacionado a nenhuma outra noção de sistema ou hora do relógio de parede . "Vamos lá pessoal! Ninguém mencionou a maneira Guava de fazer isso (o que é sem dúvida incrível):
O bom é que Stopwatch.toString () faz um bom trabalho ao selecionar unidades de tempo para a medição. Ou seja, se o valor for pequeno, ele produzirá 38 ns, se for longo, mostrará 5m 3s
Ainda melhor:
Nota: O Google Guava requer Java 1.6 ou superior
fonte
start()
várias vezes seguidas (o mesmo parastop()
).Usando o Instant and Duration da nova API do Java 8,
saídas,
fonte
Duration.between(start, end).getSeconds()
.Duration
também possui métodos para converter para outras unidades de tempo, por exemplo,toMillis()
que converte em milissegundos.Reuniu todas as formas possíveis juntas em um só lugar.
Encontro
Sistema. currentTimeMillis ()
Formato legível por humanos
Goiaba: Google Stopwatch JAR «Um objetivo do cronômetro é medir o tempo decorrido em nanossegundos.
Apache Commons Lang JAR «O StopWatch fornece uma API conveniente para horários.
JODA -TIME
API de data e hora do Java do Java 8 «Um objeto Duration representa um período de tempo entre dois objetos Instantâneos .
O Spring Framework fornece aclasse de utilitário StopWatch para medir o tempo decorrido em Java.
Resultado:
fonte
Use um profiler (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler, etc). Você obterá os resultados mais precisos e é o menos invasivo. Eles usam o mecanismo interno da JVM para criação de perfil, que também pode fornecer informações extras, como rastreios de pilha, caminhos de execução e resultados mais abrangentes, se necessário.
Ao usar um criador de perfil totalmente integrado, é trivial criar um perfil de um método. Clique com o botão direito do mouse em Profiler -> Adicionar aos métodos raiz. Em seguida, execute o criador de perfil como se estivesse executando um teste ou depurador.
fonte
Provavelmente não é isso que você queria que eu dissesse, mas esse é um bom uso da AOP. Use um interceptador proxy no seu método e faça o tempo necessário.
Infelizmente, o que, por que e como da AOP está além do escopo desta resposta, mas é assim que eu provavelmente faria.
Edit: Aqui está um link para o Spring AOP para você começar, se você estiver interessado. Esta é a implementação mais acessível do AOP que eu encontrei para java.
Além disso, dadas as sugestões muito simples de todos os outros, devo acrescentar que o AOP é para quando você não quer coisas como o tempo para invadir seu código. Mas em muitos casos, esse tipo de abordagem simples e fácil é bom.
fonte
System.currentTimeMillis();
NÃO é uma boa abordagem para medir o desempenho de seus algoritmos. Ele mede o tempo total que você experimenta como usuário assistindo à tela do computador. Ele também inclui o tempo consumido por todo o resto em execução no seu computador em segundo plano. Isso pode fazer uma enorme diferença caso você tenha muitos programas em execução na sua estação de trabalho.A abordagem adequada é usar o
java.lang.management
pacote.No site http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking :
getCpuTime()
O método fornece a soma desses:fonte
Com o Java 8, você também pode fazer algo assim com todos os métodos normais :
com TimeIt como:
Com esse método, você pode fazer uma medição fácil do tempo em qualquer lugar do seu código sem quebrá-lo. Neste exemplo simples, apenas imprimo a hora. Você pode adicionar um Switch for TimeIt, por exemplo, para imprimir apenas a hora no DebugMode ou algo assim.
Se você estiver trabalhando com o Function, poderá fazer algo assim:
fonte
Também podemos usar a classe StopWatch dos bens comuns do Apache para medir o tempo.
Código de amostra
fonte
Apenas uma pequena reviravolta, se você não usar ferramentas e quiser cronometrar métodos com baixo tempo de execução: execute-o várias vezes, sempre que dobrar o número de vezes em que é executado até chegar a um segundo, aproximadamente. Portanto, a hora da chamada para System.nanoTime e assim por diante, nem a precisão de System.nanoTime afetam muito o resultado.
Obviamente, as advertências sobre o uso do relógio de parede se aplicam: influências da compilação JIT, vários encadeamentos / processos etc. Portanto, é necessário primeiro executar o método várias vezes primeiro, para que o compilador JIT faça seu trabalho e depois repita esse teste várias vezes e tome o menor tempo de execução.
fonte
Estamos usando anotações AspectJ e Java para esse fim. Se precisarmos saber o tempo de execução de um método, simplesmente o anotamos. Uma versão mais avançada pode usar um nível de log próprio que pode ser ativado e desativado no tempo de execução.
fonte
JEP 230: Suíte Microbenchmark
FYI, JEP 230: Microbenchmark Suite é um projeto OpenJDK para:
Esse recurso chegou no Java 12 .
Arnês de Microbenchmark Java (JMH)
Para versões anteriores do Java, dê uma olhada no projeto Java Microbenchmark Harness (JMH) no qual o JEP 230 se baseia.
fonte
Código realmente bom.
http://www.rgagnon.com/javadetails/java-0585.html
fonte
long millis = TimeUnit.MILLISECONDS.toMillis(duration) - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); if (days == 0) { res = String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, millis); } else { res = String.format("%dd%02d:%02d:%02d.%02d", days, hours, minutes, seconds, millis); }
Você pode usar o Perf4j . Utilitário muito legal. O uso é simples
Mais informações podem ser encontradas no Guia do desenvolvedorEdit: Projeto parece morto
fonte
fonte
Basicamente, faço variações disso, mas, considerando o funcionamento da compilação do ponto de acesso, se você deseja obter resultados precisos, precisa realizar as primeiras medições e garantir que está usando o método em um aplicativo do mundo real (leia-se o aplicativo).
Se o JIT decidir compilá-lo, seus números variarão bastante. então fique atento
fonte
Usando AOP / AspectJ e
@Loggable
anotação de jcabi-aspect, você pode fazer isso de maneira fácil e compacta:Todas as chamadas para esse método serão enviadas para o recurso de log do SLF4J com
DEBUG
nível de log. E toda mensagem de log incluirá tempo de execução.fonte
O Spring fornece uma classe de utilitário org.springframework.util.StopWatch , conforme JavaDoc:
Uso:
Resultado:
Com Aspectos:
fonte
Eu escrevi um método para imprimir o tempo de execução do método de uma forma muito legível. Por exemplo, para calcular o fatorial de 1 milhão, leva aproximadamente 9 minutos. Portanto, o tempo de execução é impresso como:
O código está aqui:
fonte
Existem algumas maneiras de fazer isso. Normalmente, volto a usar algo assim:
ou a mesma coisa com System.nanoTime ();
Para algo mais sobre o lado do benchmarking, parece haver também este: http://jetm.void.fm/ Mas nunca tentei.
fonte
Você pode usar a biblioteca Metrics , que fornece vários instrumentos de medição. Adicionar dependência:
E configure-o para o seu ambiente.
Os métodos podem ser anotados com @Timed :
ou parte do código envolvido com Timer :
Métricas agregadas podem ser exportadas para console, JMX, CSV ou outro.
@Timed
exemplo de saída de métricas:fonte
Se você quiser o relógio de parede
fonte
Como "skaffman" disse, use AOP OU você pode usar a tecelagem por código de tempo de execução, assim como as ferramentas de cobertura do método de teste de unidade usam para adicionar de forma transparente informações de tempo aos métodos invocados.
Você pode ver o código usado por ferramentas de ferramentas de código aberto, como Emma ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ). A outra ferramenta de cobertura de código aberto é http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download .
Se você finalmente conseguir fazer o que deseja, pls. compartilhe-o de volta com a comunidade aqui com suas tarefas / frascos de formigas.
fonte
fonte
Modifiquei o código da resposta correta para obter o resultado em segundos:
fonte
Você pode usar a classe cronômetro do projeto principal da primavera:
Código:
Documentação para cronômetro: cronômetro simples, permitindo o tempo de várias tarefas, expondo o tempo total e o tempo de execução de cada tarefa nomeada. Esconde o uso de System.currentTimeMillis (), melhorando a legibilidade do código do aplicativo e reduzindo a probabilidade de erros de cálculo. Observe que este objeto não foi projetado para ser seguro para threads e não usa sincronização. Essa classe é normalmente usada para verificar o desempenho durante a prova de conceitos e no desenvolvimento, e não como parte dos aplicativos de produção.
fonte
Você pode tentar dessa maneira se quiser saber a hora.
fonte
Ok, esta é uma classe simples a ser usada para o tempo simples e simples de suas funções. Há um exemplo abaixo.
Amostra de uso:
Amostra de saída do console:
fonte
No Java 8, uma nova classe denominada
Instant
é introduzida. Conforme o documento:Isso pode ser usado como:
Imprime
PT7.001S
.fonte