среда, 16 октября 2019 г.

Паттерны в Golang: Timing Functions

При оптимизации кода иногда требуется быстрое измерение времени исполнения кода для проверки предположений вместо использования инструментов/фреймворков профилирования.

В таких случаях измерения времени могут быть выполнены с использованием пакета 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


Читайте также:


Комментариев нет:

Отправить комментарий