Вставка / замена кода Голанга
Мне нравится не допустить повторения кода. Но у меня есть ситуация, когда я должен повторять это в каждой функции, я хочу измерить время выполнения, и я ничего не могу с этим поделать. Например, функция:
func someFunc() {
start_time := time.Now()
defer fmt.Println("Execution time: %v", time.Now().Sub(start_time))
<... doing some bussiness ...>
}
Теперь я должен повторить эти два первых удара в каждой функции (а в оригинале они более сложны из-за вызова имени функции). Поэтому я не могу сделать функцию, которая измеряет время, потому что я должен использовать defer внутри него. Я не могу создать функцию даже для второго удара, потому что в оригинале она вызывает имя функции в Println, и поэтому полученное имя не будет иметь нужной функции. Есть ли способ вставить этот код по какой-либо метке или шаблону, например, так:
func someFunc() {
//go-insert measuretime.tmpl
<... doing some bussiness ...>
}
И measuretime.tmpl это:
start_time := time.Now()
defer fmt.Println("Execution time: %v", time.Now().Sub(start_time))
1 ответ
Этот прием может помочь: отложить вызов функции, возвращающей функцию, включающую время начала.
func elapsed() func() {
start := time.Now()
return func() {
fmt.Println("Duration was", time.Since(start))
}
}
Назовите это следующим образом:
defer elapsed()()
Сказав это, бенчмаркинг является обычным способом измерения производительности в Go. Посмотрите, как писать тесты в Go.