Tempo simples em golang
Às vezes, você quer apenas fazer alguns tempos rápidos e sujos de um segmento de código. Uma maneira simples de cronometrar a execução em Golang é usar as funções time.Now()
e time.Since()
:
func main() {
start := time.Now()
r := new(big.Int)
fmt.Println(r.Binomial(1000, 10))
elapsed := time.Since(start)
log.Printf("Binomial took %s", elapsed)
}
Você precisará importar o time
pacote para usar isso. A saída é a esperada de um mecanismo de tempo:
2013/05/29 23:16:42 Binomial took 179us
Claro, isso também funciona para chamadas de função, mas fica confuso rapidamente. E se tivermos caminhos de retorno diferentes ou quisermos aplicar esse truque a muitas partes do código? Então você pode usar o timeTrack
truque.
Funções de tempo em golang
Quando se trata de chamadas de função de cronometragem, existe este pequeno truque adaptado de Stathat :
func timeTrack(start time.Time, name string) {
elapsed := time.Since(start)
log.Printf("%s took %s", name, elapsed)
}
que pode ser colocado próximo ao topo do seu código e, em seguida, usado para cronometrar qualquer função como esta:
func factorial(n *big.Int) (result *big.Int) {
defer timeTrack(time.Now(), "factorial")
// ... do some things, maybe even return under some condition
return n
}
Esta é a aparência da saída:
2013/05/29 23:16:42 factorial took 82us
Você pode personalizar essa timeTrack
função facilmente: substitua a log
chamada por qualquer coisa que você quiser ou remova o name
parâmetro se isso o incomodar.
Como é que isso funciona?
A defer
instrução embutida de Go adia a execução da função especificada até que a função atual retorne. Portanto, não importa o caminho que a factorial
função tome para retornar, a chamada defer será feita logo antes. Além disso, quaisquer parâmetros dados à timeTrack
função serão avaliados no momento em que a defer
chamada for feita, de modo que o que é passado para realmente é o horário de início da função que você deseja cronometrar.time.Now()
timeTrack
factorial
Full Source e Playground
Você pode verificar o código completo e o exemplo de trabalho e brincar com eles no Go Playground .
Esteja avisado, porém, o Playground sempre retorna carimbos de data / hora como 1257894000 (Ter, 10 de novembro de 2009 23:00:00, a data Go se tornou um projeto de código aberto público!), Portanto, a diferença entre dois carimbos de data / hora é sempre 0. Eles fazem isso para programas se comportam de forma determinística e podem ser armazenados em cache. Você terá que executá-lo localmente para ver os tempos reais de execução.