При оптимизации кода иногда требуется быстрое измерение времени исполнения кода для проверки предположений вместо использования инструментов/фреймворков профилирования.
В таких случаях измерения времени могут быть выполнены с использованием пакета time и defer утверждений.
Реализация
package profile
import (
"time"
"log"
)
func Duration(invocation time.Time, name string) {
elapsed := time.Since(invocation)
log.Printf("%s длилось %s", name, elapsed)
}
Использование
func BigIntFactorial(x big.Int) *big.Int {
// Аргументы defer утверждения
// оцениваются немедленно и сохраняются.
// Отложенная функция получает
// пред-оценочные значения когда она вызывается.
defer profile.Duration(time.Now(), "IntFactorial")
y := big.NewInt(1)
for one := big.NewInt(1); x.Sign() > 0; x.Sub(&x, one) {
y.Mul(y, &x)
}
return x.Set(y)
}
Пример
package main
import (
"log"
"math/big"
"time"
)
func Duration(invocation time.Time, name string) {
elapsed := time.Since(invocation)
log.Printf("%s длилось %s", name, elapsed)
}
func BigIntFactorial(x big.Int) *big.Int {
// Аргументы defer утверждения
// оцениваются немедленно и сохраняются.
// Отложенная функция получает
// пред-оценочные значения когда она вызывается.
defer Duration(time.Now(), "IntFactorial")
y := big.NewInt(1)
for one := big.NewInt(1); x.Sign() > 0; x.Sub(&x, one) {
y.Mul(y, &x)
}
return x.Set(y)
}
func main() {
x := big.NewInt(10)
v := BigIntFactorial(*x)
log.Println(v)
}
Вывод
2019/10/16 16:18:48 IntFactorial длилось 2.53µs
2019/10/16 16:18:48 3628800
Читайте также:
- Паттерны в Golang: Observer (Наблюдатель)
- Паттерны в Golang: Builder (Строитель)
- Паттерны в Golang: Factory Method (Фабричный метод)
Комментариев нет:
Отправить комментарий