Página 1 de 1
Cálculo estimativa de tempo.
Enviado: 20 Nov 2011 17:18
por asimoes
Pessoal,
Alguém teria uma função que estima o tempo de término de um processamento?
[]´s
Cálculo estimativa de tempo.
Enviado: 21 Nov 2011 08:44
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.
Cálculo estimativa de tempo.
Enviado: 21 Nov 2011 10:19
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.
Cálculo estimativa de tempo.
Enviado: 21 Nov 2011 15:16
por asimoes
Valeu Mestre Eolo,
Com a sua dica já dá para construir a função.
[]´s
Cálculo estimativa de tempo.
Enviado: 21 Nov 2011 17:57
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.
Cálculo estimativa de tempo.
Enviado: 22 Nov 2011 08:23
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 )
Cálculo estimativa de tempo.
Enviado: 22 Nov 2011 11:06
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.