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:

  1. Há compilação de hotspot - que é uma otimização de tempo de execução que eu preciso desativar (eu acho).

  2. 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

Foi útil?

Solução

  1. Usar -Xint Sinalizador JVM. Outras opções podem ser vistas aqui.

  2. 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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top