11 de nov. de 2008

Reduzindo o consumo da CPU em processos longos

Hoje me deparei com um problema um tanto comum para a maioria dos desenvolvedores. Uma de minhas aplicações rodando em um servidor de internet estava consumindo 100% da CPU do mesmo, quando em execução. Isso estava prejudicando o acesso das demais aplicações e degradando o sistema.

O objetivo da aplicação é ler uma base de dados em XML e atualizar o banco, portanto, envolve uma série de loops. 

Uma solução super simples resolveu meu problema. Bastou colocar um comando Sleep(10) no fim de cada loop (pode ser no início também) e acabou-se o problema de consumo de processador.

A função Sleep faz com que a thread da aplicação adormeça por 10 milisegundos (no meu caso) e devolve o controle da CPU ao Sistema Operacional, tempo mais que suficiente para que os outros processos sejam executados tranquilamente. 

Com o uso do Sleep, o consumo de CPU caiu de 100% para uma média de 7 a 8%, e em raros momentos chega a 40%.

2 comentários:

  1. se usar

    Application.ProcessMessages;

    faria o mesmo

    Edmar Frazão

    ResponderExcluir
  2. Acredito que não seja a mesma coisa. Application.ProcessMessages faz com que a aplicação processe mensagens recebidas, ou seja, continua usando a CPU. Num processo longo, você pode usar ProcessMessages para atualizar um relógio, por exemplo.

    Sleep faz com que a aplicação "adormeça", liberando a CPU para o Sistema Operacional.

    ResponderExcluir