Cálculo estimativa de tempo.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Cálculo estimativa de tempo.

Mensagem por asimoes »

Pessoal,

Alguém teria uma função que estima o tempo de término de um processamento?

[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Cálculo estimativa de tempo.

Mensagem por Itamar M. Lins Jr. »

Ola!

Código: Selecionar todos

Function Main
nTP := time()
do while
...
Enddo

? "Tempo de processamento: "+elaptime(nTP,time())
Tem também a hb_millisecs()

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Cálculo estimativa de tempo.

Mensagem por Eolo »

Asimoes, pra calcular uma estimativa de tempo a decorrer (e não o tempo decorrido, como o Itamar sugeriu), vc precisa ter:
- o tamanho total da que vai ser processado
- o tamanho de cada 'pedaço' processado

(é semelhante ao cálculo pra mostrar uma barra progressiva, só que considerando também o tempo)

Imagine por exemplo copiar um DBF com 500.000 registros, sendo blocos de 1.000 registros a cada loop da cópia:
- marque a HH:MM:SS do inicio da cópia
- no primeiro loop, processados 1.000 registros, marque a nova HH:MM:SS e calcule a diferença em segundos para a hora inicial.
- digamos que foram gastos 10 segundos no primeiro loop, então é só usar uma regra de 3 para estimar o tempo total:

1.000 registros = 10 segundos decorridos
500.000 registros = ? segundos
? = (500.000 x 10) / 1.000 -> 5.000 segundos
Diminuindo os 10 segundos já decorridos, a estimativa é de 4.990 segundos para os blocos restantes.

No segundo loop, digamos que a velocidade mudou, tendo sido copiados 2.000 registros a tempo total de 15 segundos:

2.000 = 15 segundos
500.000 = ?
? = 3.750 segundos
Diminuindo os 15 segundos já decorridos, a estimativa é de 3.735 segundos para os blocos restantes.


Neste exemplo, considero o tempo total decorrido sempre em relação à hora inicial, então é usado como estimativa um tempo 'médio' de todos os blocos já processados. Se você quiser, vá mudando a hora inicial para o inicio de cada bloco, aí vc pega somente a velocidade do último bloco para estimar o restante. Mas não acredito que seja necessário inventar muito. Você dando para o usuário uma idéia aproximada do tempo restante, já deve resolver o problema.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Cálculo estimativa de tempo.

Mensagem por asimoes »

Valeu Mestre Eolo,

Com a sua dica já dá para construir a função.

[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Cálculo estimativa de tempo.

Mensagem por Eolo »

Tá meio diferente do que falei acima, mas quem sabe ajuda... Não está testado pra produção! :-)

Código: Selecionar todos

function copiadbf
clear
priv conta:=1
use arquivo new excl
priv totalrec=lastrec()
priv inicio=seconds()
@10,10 say "Tempo restante estimado: calculando..."
copy to lixo.dbf while demorando()
quit

Código: Selecionar todos

function demorando
if (conta%2000)=0
  ateagora=seconds()-inicio
  estima=(((totalrec-conta)*ateagora)/conta)
  @10,10 say "Tempo restante estimado: "+alltrim(str(estima,0))+" segundo(s)"
endi
conta++
retu .t.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

Cálculo estimativa de tempo.

Mensagem por asimoes »

Grande Eolo,

Sua dica foi de grande valia baseado nos seus exemplos contrui esta função:

Código: Selecionar todos

FUNCTION TempoProc(nCont,nTotal)
STATIC nTime
LOCAL nPorcenta, nTempoGasto, cTime
   IF nTime = Nil
      nTime:=0
   ENDIF
   nPorcenta  :=( nCont / nTotal ) * 100
   nTempoGasto:=Seconds() - nTempoInicio
   nTempoGasto:=((( nTempoGasto * 100 ) / nPorcenta ) - nTempoGasto)
   nTime:=Max(nTempoGasto * 2,nTime)
   cTime:=Seconds2Time(nTime)
RETURN cTime

FUNCTION Seconds2Time( nSegundos )
LOCAL cHora:=StrZero( Int(nSegundos / 3600),2)
nSegundos %= 3600
cHora += ':'+ StrZero( Int(nSegundos/60),2) + ':'
nSegundos %= 60
cHora += StrZero( Int(nSegundos),2)
RETURN( cHora )
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Cálculo estimativa de tempo.

Mensagem por Eolo »

Chic. Agora é só correr pro abraço!


Um 'ajuste fino' que talvez seja interessante incluir na sua rotina: a função SECONDS() retorna os segundos decorridos das 00:00:00hs até a hora atual, certo? Só que se vc iniciar um processamento às 23:50:00 e rodar SECONDS() depois da meia noite, digamos às 00:01:00, o tempo total vai bagunçar: vai aparecer 1 minuto ao invés de 11.

Pra resolver isso, vc pode ser verificar a cada leitura se a hora atual é MENOR que a hora inicial. Se 00:01:00 é menor que 23:50:00, vc guarda esses 10 minutos de ONTEM e os acrescenta aos resultados seguintes de SECONDS().

Isto é meio exagero, pouca gente vai estar trabalhando à meia-noite, mas não custa nada cercar.
Responder