Medindo o tempo de execução em Go

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 timepacote 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 timeTracktruque.

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 timeTrackfunção facilmente: substitua a logchamada por qualquer coisa que você quiser ou remova o nameparâmetro se isso o incomodar.

Como é que isso funciona?

A deferinstruçã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 factorialfunção tome para retornar, a chamada defer será feita logo antes. Além disso, quaisquer parâmetros dados à timeTrackfunção serão avaliados no momento em que a deferchamada 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()timeTrackfactorial

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.