Marcar tempo de uma função Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Azarfy
Posts: 33
Joined: 25 Mar 2020, 20:21

Marcar tempo de uma função

19 Jul 2020, 22:03

:arrow: Bom, queria aprender a como marcar e dar o quanto de tempo gasto,
quando eu apertasse uma determinada função, alguém pode me orientar a melhor forma de fazer ?
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Marcar tempo de uma função  Topic is solved

20 Jul 2020, 09:22

Bom dia Azarfy.

A melhor maneira de checar o tempo que alguma porção do seu código levou para executar é utilizar a variável embutida A_TickCount.

Essa variável contém o totoal de milisegundos transcorridos desde a última vez que o computador iniciou. O uso dela é simples:

1. No início da rotina, copie o conteúdo da variável A_TickCount para uma outra variável sua (você pode chamá-la de INICIO, por exemplo).

2. No final da rotina, deduza o valor da variável que você criou (INICIO) da variável A_TickCount (esta variável se atualiza enquanto o código roda, então neste momento ela vai conter um valor maior do que tinha quando você a copiou no início do código). Depois, divida o resultado por 1000 (se quiser ver ele em segundos) e exiba como preferir (em uma msgbox, por exemplo).

Exemplo 1:

Code: Select all

INICIO := A_TickCount
Var1 := 0


Loop 1000000
{
	Var1++
}


FINAL := (A_TickCount - INICIO) / 1000

msgbox, 0, Aviso, A rotina levou %FINAL% segundos para efetuar 1 milhão de operações de acréscimo (e também rodar as demais linhas).
Return

Exemplo 2:

Code: Select all

INICIO := A_TickCount
Var1 := 0


Sleep 5000 ; Neste lugar vai sempre estar a rotina que você quer medir o tempo de execução. Se for uma função, basta colocar a chamada à ela aqui (o corpo da função não precisa estar aqui, pois a execução pula para ela após a chamada e só volta aqui quando termina)


FINAL := (A_TickCount - INICIO) / 1000

msgbox, 0, Aviso, A rotina de dormir (Sleep) por 5 segundos levou %FINAL% segundos para concluir.
Return

:arrow: Convém lembrar que scripts que precisem de maior performance devem usar o comando SetBatchLines, -1 no seu início.

:arrow: Este método é ideal para você otimizar seus scripts. Modifique as linhas de um código que você está testando e veja o que ocorre com o tempo de execução. O objetivo é que as mudanças diminuam ele. Procure efetuar mudanças que tenham algum sentido em economizar tempo de execução (diminuir ou remover sleeps, usar métodos alternativos de fazer a mesma coisa, etc).

:arrow: Ainda no campo das dicas de otimização, lembre-se que em um script grande você pode medir os tempos de execuções das rotinas individuais e assim ter mais precisão no seu trabalho de otimização.

:arrow: Exemplo de como faria para medir o tempo de execução de uma função:

Code: Select all

INICIO := A_TickCount


Var1 := 1
TOTAL := MULTIPLICAR_UM_MILHAO_DE_VEZES(Var1)


FINAL := (A_TickCount - INICIO) / 1000

msgbox, 0, Aviso, A rotina levou %FINAL% segundos para concluir. O resultado é %TOTAL%
Return


MULTIPLICAR_UM_MILHAO_DE_VEZES(VAR)
{
	Loop 1000000
	{
		VAR  := VAR * 1.00001
	}
	Return VAR
}

:arrow: Exemplo do mesmo código, mas agora utilizando SetBatchLines, -1 (veja o ganho de performance em relação ao código acima):

Code: Select all

SetBatchLines, -1 ; Neste código, utilizamos o SetBatchLines, -1 para aumentar a performance.
INICIO := A_TickCount


Var1 := 1
TOTAL := MULTIPLICAR_UM_MILHAO_DE_VEZES(Var1)


FINAL := (A_TickCount - INICIO) / 1000

msgbox, 0, Aviso, A rotina levou %FINAL% segundos para concluir. O resultado é %TOTAL%
Return


MULTIPLICAR_UM_MILHAO_DE_VEZES(VAR)
{
	Loop 1000000
	{
		VAR  := VAR * 1.00001
	}
	Return VAR
}
Azarfy
Posts: 33
Joined: 25 Mar 2020, 20:21

Re: Marcar tempo de uma função

20 Jul 2020, 09:52

Funcionou muito bem e como o esperado !

Bom, minha duvida sobre o mesmo caso é como eu consigo trabalhar o resultado com 2 casas apos a virgula ?
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Marcar tempo de uma função

20 Jul 2020, 12:00

Você pode utilizar a função embutida Round() para trabalhar em 2 casas (ou mais se quiser).

Exemplo (o exemplo abaixo utiliza o código do exemplo 1 do post acima, mas faz uso da função round para trazer o tempo para 2 casas decimais):

Code: Select all

INICIO := A_TickCount
Var1 := 0


Loop 1000000
{
	Var1++
}


FINAL := Round((A_TickCount - INICIO) / 1000, 2)

msgbox, 0, Aviso, A rotina levou %FINAL% segundos para efetuar 1 milhão de operações de acréscimo (e também rodar as demais linhas).
Return

:arrow: Com relação à vírgula temos uma questão importante: Nos estados unidos, as casas decimais utilizam ponto no lugar da vírgula (e as casas de milhares utilizam vírgula no lugar do ponto). Por este motivo os cálculos no AutoHotkey exibem decimais com ponto (e não com vírgula), e os valores de variáveis só são interpretados como números se as casas decimais estiverem ausentes ou forem escritas após ponto (os milhares também não podem ter separadores).

1. Exemplos de valores que podem SIM ser entendidos como numéricos pelo interpretador (pode ser usado Round() neles, por exemplo):

1879.33
99.12
157
23847872.5634

2. Exemplos de valores que NÃO serão entendidos como numéricos pelo interpretador (não daria para usar Round() neles, por exemplo):

1.879.33
99,12
23847872,5634
1,234,456
3.578,493
8,567.499


:arrow: Caso deseja exibir um valor com o formato brasileiro (com vírgula para os decimais) você deverá converte-lo após o cálculo (e caso precise usar ele em outro cálculo, converter de volta para o padrão que pode ser entendido). Essas conversões são fáceis de fazer com uma função (disponibilizei as funções que escrevi para isso caso precise, você pode encontrá-las aqui).

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 44 guests