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 ?
Marcar tempo de uma função Topic is solved
Moderator: Gio
Re: Marcar tempo de uma função Topic is solved
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:
Exemplo 2:
Convém lembrar que scripts que precisem de maior performance devem usar o comando SetBatchLines, -1 no seu início.
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).
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.
Exemplo de como faria para medir o tempo de execução de uma função:
Exemplo do mesmo código, mas agora utilizando SetBatchLines, -1 (veja o ganho de performance em relação ao código acima):
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
Convém lembrar que scripts que precisem de maior performance devem usar o comando SetBatchLines, -1 no seu início.
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).
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.
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
}
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
}
"What is suitable automation? Whatever saves your day for the greater matters."
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Re: Marcar tempo de uma função
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 ?
Bom, minha duvida sobre o mesmo caso é como eu consigo trabalhar o resultado com 2 casas apos a virgula ?
Re: Marcar tempo de uma função
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):
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
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).
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
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
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).
"What is suitable automation? Whatever saves your day for the greater matters."
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Barcoder - Create QR Codes and other Barcodes using only Autohotkey !!
Archmage Gray - A fantasy shooter game fully coded in AutoHotkey
Return to “Ajuda e Suporte Geral”
Who is online
Users browsing this forum: No registered users and 44 guests