Pergunta

Eu estou escrevendo um jogo de damas simples em Java. Quando eu mouse sobre a bordo do meu processador de rampas de até 50% (100% em um núcleo).

Gostaria de saber qual parte do meu código (assumindo a sua culpa minha) está executando durante este.

Eu tentei depuração, mas passo através de depuração não funciona muito bem neste caso.

Existe alguma ferramenta que pode me dizer onde minhas mentiras do problema? Atualmente, estou usando Eclipse.

Foi útil?

Solução

Isso é chamado de "profiling". Seu IDE provavelmente vem com um:. Consulte Open Source Profilers em Java

Outras dicas

Use um profiler (por exemplo YourKit )

Profiling? Eu não sei o IDE você está usando, mas Eclipse tem um proflier decente e também há uma lista de alguns perfis de código aberto em java-source .

Em poucas palavras, profilers irá dizer-lhe que parte do seu programa está sendo chamado quantas vezes.

Eu não Perfil Minha programas muito, então eu não tenho muita experiência, mas eu tenho jogado ao redor com o o NetBeans IDE profiler quando eu estava testando-o para fora. (Eu costumo usar Eclipse também. Eu também vou olhar para as características de perfil em Eclipse.)

O profiler do NetBeans irá dizer-lhe qual thread estava sendo executado por quanto tempo, e quais os métodos têm sido chamados por quanto tempo, e lhe dará bar gráficos para mostrar quanto tempo cada método tem tomado. Isso deve lhe dar uma dica de qual método está causando problemas. Você pode dar uma olhada na Java profiler que o NetBeans IDE fornece, se você está curioso.

Profiling é uma técnica que é geralmente usado para medir quais partes de um programa é tomando um monte de tempo de execução, que por sua vez pode ser usado para avaliar se deve ou não realizar otimizações seria benéfico para aumentar o desempenho de um programa .

Boa sorte!

1) É culpa sua:)

2) Se você estiver usando eclipse ou netbeans, tente usar as características de perfil -. Ele deve rapidamente dizer-lhe onde o código está gastando muito tempo

3) na sua falta, adicione a saída do console onde você acha que o loop interno é -. Você deve ser capaz de encontrá-lo rapidamente

Sim, existem tais ferramentas: você tem que traçar o perfil do código. Você pode tentar TPTP no eclipse ou talvez tente JProfiler . Isso vai deixar você ver o que está sendo chamado e quantas vezes.

Use um profiler. Há muitos. Aqui está uma lista: http://java-source.net/open-source/profilers. Por exemplo, você pode usar JIP , um java codificado profiler.

Clover dará um bom relatório mostrando a contagem de sucesso para cada linha e ramo. Por exemplo, este linha foi executado 7 vezes.

Plugins para Eclipse, Maven, Ant e IDEA estão disponíveis. É livre para código aberto, ou você pode obter um 30 dias de licença de avaliação .

Se você estiver usando Sun Java 6, em seguida, a maioria dos lançamentos JDK recentes vêm com jvisualvm no diretório bin. Este é um acompanhamento capaz e ferramenta que vai exigir muito pouco esforço para o uso de perfis - você não precisa mesmo de iniciar o seu programa com parâmetros especiais - jvisualvm simplesmente lista todos os processos Java atualmente em execução e você escolher o que você quiser jogar com .

Esta ferramenta irá dizer-lhe quais os métodos a utilizar todo o tempo do processador.

Há uma abundância de ferramentas mais poderosas lá fora, mas ter um jogo com um livre em primeiro lugar. Então, quando você ler sobre o que outros recursos estão disponíveis lá fora, você vai ter uma tinta sobre como eles podem ajudá-lo.

Este é um problema tipicamente 'High CPU'.

Existem dois tipos de problemas de alta CPU

a) Quando na thread está usando 100% da CPU de um núcleo (Este é o seu cenário)

uso da CPU

b) é 'anormalmente elevado' quando executar determinadas ações. Nesses casos CPU pode não ser 100%, mas vai ser anormalmente alta. Normalmente, isso acontece quando temos operações intensivas de CPU no código como análise XML, serialização de-serialização etc.

Case (a) é fácil de analisar. Quando você experimenta 100% da CPU 5-6 fio de despejos em 30 intervalo seg. Olhar para uma discussão que está ativo (no estado "executável") e que está dentro do mesmo método (você pode inferir que, monitorando a pilha de thread). Muito provavelmente que você vai ver um 'espera ocupado' (veja o código abaixo para um exemplo)

while(true){
  if(status) break;
  // Thread.sleep(60000); // such a statement would have avoided busy wait
}

Case (b) também pode ser analisado usando a linha dumps tomado em igual intervalo. Se tiver sorte, você será capaz de descobrir o código de problema, se você não é capaz de identificar o código de problema usando despejo de thread. Você precisa de recorrer a profilers. Na minha experiência YourKit profiler é muito bom.

Eu sempre tento com fio de despejos em primeiro lugar. Profilers só será último recurso. Em 80% dos casos, será capaz de identificar usando lixeiras linha.

ou casos de teste uso JUnit e uma ferramenta de cobertura de código para alguns componentes comuns de vocês. Se houver componentes que exigem outros componentes, você vai ver rapidamente os executados muitas mais vezes.

Eu uso Clover com casos de teste JUnit, mas para open-source, eu ouço EMMA é muito bom.

No código single-threaded, acho adicionando algumas declarações como esta: System.out.printlnl ( "A:" + System.currentTimeMillis ()); é mais simples e tão eficaz quanto usando um profiler. Em breve você poderá diminuir a parte do código causando o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top