Java Task Runtime
-
03-07-2019 - |
Pergunta
Antes de tudo, tenho que admitir que essas são perguntas muito básicas e primitivas ... quero demonstrar algoritmos diferentes em Java para classificar e pesquisar e obter um valor para o tempo de execução. Existem problemas que não posso resolver:
Há compilação de hotspot - que é uma otimização de tempo de execução que eu preciso desativar (eu acho).
Como faço para obter valores de tempo (segundos) para o tempo de execução? Iniciar um cronômetro antes da execução e parar depois ... parece um pouco primitivo. E o objeto do timer consome tempo de execução ... preciso evitar isso.
Existe algo na API Java que se possa utilizar para resolver esses problemas?
Obrigado, Klaus
Solução
Usar
-Xint
Sinalizador JVM. Outras opções podem ser vistas aqui.Use o
ThreadMXBean
API para obter horários de CPU/usuário para o seu tópico. Um exemplo pode ser visto aqui.
Outras dicas
Você pode desativar o hotspot com -Xint
Na linha de comando, para obter uma diminuição da ordem de magnitude no desempenho. No entanto, por que você não quer medir o desempenho do mundo real? Coisas diferentes podem se tornar gargalos quando você compila.
Geralmente para Microbenchmarks:
- usar
System.nanoTime
para obter uma medição de tempo no início e no fim - Corra por um período razoável
- Faça a medição várias vezes (há algum "aquecimento")
- Não entrelaça medidas de diferentes algoritmos
- Não faça nenhuma E/S no segmento medido
- Use o resultado (o hotspot pode otimizar completamente as operações triviais)
- Faça isso em uma situação do mundo real (ou um cloae possível)
- Lembre -se de que o núcleo duplo é a norma, e mais núcleos se tornarão normais
O uso do System.nanotime () consome duas vezes menos de 1 micro-segundo. Sugiro que você execute qualquer referência por um número de segundo e faça uma média para que um erro de micro-segundo não seja significativo.
No geral, sugiro não tornar as coisas mais complicadas do que você precisa.
Para ter um aquecimento incorporado, muitas vezes ignoro os primeiros 10% a 20% das iterações. Algo como
long start;
int count;
for(int i = -count / 5; i < count; i++) {
if (count == 0) start = System.nanoTime();
// do tested code
}
long time = System.nanoTime() - start;
long average = time / count;
System.out.printf("Average time was %,d micro-seconds%n", average / 1000);