Alguém sabe por que alguns programas quando rodam certas rotinas ficam com 100% de uso de CPU? Alguém sabe como amenizar isso? Eu poderia usar Threads? Não estou me referindo apenas ao Java.
Estou fazendo um programa que faz uma parada, mas o chato é que ele fica com esses malditos 100%.
Mas o pior é outro programa de um colega meu, que roda como um serviço e fica pingando para um servidor de tempos em tempos. Mas ele fica direto com esses 100%, precisávamos tirar isso. Como os outros programas fazem coisas e não ficam assim?
esses processos que usam muito recurso da CPU com certeza ou fazer um trabalho exorbitante de processamento ou estão com algum tipo de problema em alguma logica (algum loop, teste de IO)
eu não acho q threads va diminuir o processamento se este estiver com erro. mas sim serão uma boa medida para tornar seu sistema mais robusto…
Dica: Se voce usa linux da uma olhada nos temas sobre processo, escalonamento, alocação e compartilhamento de recursos POSIX.
Se sua aplicação possui um CPU burst muito alto, que tal um CPU hyperthreaded ou mais um CPU?
Faça o seguinte, ative o log do GC e veja quanto tempo ele está levando apra fazer um Full GC. Pode ser que você possa amenizar isso com uma otimização no GC, mas se tiver que apelar para isso é sinal que algo provavelmente está errado na sua arquitetura (otimizaçãod e GC é sempre bom, mas quando o GC passa a ser um problema, a culpa é do programador, experiência própria )
scottys0, o programa faz uma busca no registro do Windows, usando uma função recursiva. Só que a busca do regedit nem de longe fica com esses 100% de CPU. E o que tem demais dar um ping de tempos em tempos, usando um timer? Eu não consigo ver motivo pro troço consumir toda a CPU. Acho que até um loop grande de soma de dois números ficaria em 100%…
E como está a alocação dos objetos disto aí? Como disse o Phillip, parece coisa de programador tipo memory leak ou coisa do gênero.
[]s
Luca[/quote]
Desculpem mas não é em Java o programa. Me advirtam se estou errado em buscar ajuda para isso.
Luca, eu não crio objetos dentro da função recursiva, eu passo os objetos fora da chamada da função justamente para evitar processamento desnecessário. Eu gostaria de achar alguém que já tivesse enfrentado esse problema e conseguiu “resolver”.
Outra coisa, no Java se eu lançar uma thread no clique de um botão, eu posso parar o processo com outro botão, ou mesmo fechar o programa? É que no Delphi não consigo isso (só com um checkbox e o programa não fecha), não sei se é porque faço alguma coisa errada.
Não tme nada de errado, ams como o fórum é sobre Java, por default todo mundo assume que a pergunta também
O que tu usa (Delphi?) tem profiler disponível? Se tiver, procure um bom para ver se tem algo errado com sua lógica…
Parar uma thread na execução? Java tinha o Stop, ms é deprecated. Entretanto, dê uma olahda no texto do JavaDoc que vait e dar uma idéia do que pdoe ser feito.
[/quote]
O método stop da classe Thread é depreciado, mas não é que não é recomendado parar uma thread…a implementação de stop da Sun causava deadlocks e, por isso, esse método foi depreciado, mas ainda existem maneiras de parar threads sem causar problemas de sincronização e outras aberrações
Renato, uma vez eu fiz manutenção em um sistema feito em VB, que tinha um módulo que rodava como um serviço do Windows. Esse módulo tinha que ficar “adormecido” enquanto determinada ação não era feita. A lógica original ficava com um consumo de processamento próximo a 100%, porque quem fez a rotina de sleep fez um “while acao = X” normal. A solução para isso foi simplesmente usar a função sleep da API do Windows, que é, superficialmente falando, muito mais otimizada pra esse tipo de uso do que a maneira usada antes, que utiliza obviamente os recursos normais do processador.
Por esse mesmo motivo é que seu sistema que vasculha o Registro do Windows utiliza pouco processamento, porque usa a API do Windows, e o outro sistema que faz um ping simples não, porque provavelmente utiliza uma lógica normal. Mas eu não considero isso necessariamente errado. Essa lógica na verdade não está otimizada.
[quote=MarcioTavares]
Por esse mesmo motivo é que seu sistema que vasculha o Registro do Windows utiliza pouco processamento, porque usa a API do Windows, e o outro sistema que faz um ping simples não…[/quote]
Marcio, obrigado pelas dicas! Um colega no fórum de Delphi também falou do Sleep. Só esclarecendo, os dois programas, o do registro e o do ping estão em 100%, é o regedit (editor nativo do Windows) que fica com consumo bem baixo.
Dependendo da Classe que vc use, dá pra otimizar sensivelmente o acesso ao Registro. Dá pra achar milhares de implementações de classes de acesso ao Registro pela internet, mas a maioria delas usam modos de acesso meio genéricos. O ideal mesmo é pegar uma e fazer as suas próprias otimizações. Se bem que eu nunca usei acessos muito pesados no Registro… :roll:
Pessoal, o Sleep atrasa por demais o tempo de execução do processo, mas sim, diminui drasticamente o consumo de CPU. Uma alternativa que achei foi fazer um meio termo entre as duas coisas, dando um sleep só em certos momentos e não em toda chamada recursiva. Assim o consumo de CPU fica um mediano saltitante, e o tempo não fica tão demorado assim.
Mas descobrimos que o grande gargalo de tempo da rotina é a atualicação de um label (GUI) com o caminho atual no registro, que por ser grande, atrasa por volta de um minuto o total do processo. Sem o sleep e sem esse label, o tempo fica em uns 10-30 segundos.
Concluindo, prefiro 10 segundos de consumo 100% do que mais de 2 minutos de 5% ou mesmo um meio termo.
Agora o que me encuca é se vamos conseguir fazer a pesquisa ficar mais rápida dividindo as hives do registro para threads separadas.
Bom, gente… outro dia o mesmo ocorreu no meu pc. Não tinha a menor idéia do que pudesse ser, e vim pesquisar em fórums.
Apesar de a ultima msg ja ter mais de dois anos, quero dizer o q eu fiz para voltar ao normal: primeiramente eu segui o q alguns falaram, e em nao dando certo, formatei; depois de tudo novamente instalado, o problema voltou a surgir; ja pensando em formatar novamente, pensei q pudesse ser algo novo q eu tivesse instalado. Como eu instalei um jogo de 4GB, pensei em outro programa. Eis q era o Nero, mas uma versão nova, com suporte ate pro Vista. Depois q desistalei este programa, voltou ao normal. Coincidencia? Nao sei, so sei q instalei-o novamente, para fazer uma gravação, e voltou aos 100%.
Com base nessa experiencia nada interessante, q tal desinstalar o Nero e instalar uma outra versao dele?