Есть ли эффективный способ расчета времени выполнения в golang?

Я ищу лучший способ рассчитать время выполнения в go.

func main() {
    start := time.Now()

    time.Sleep(time.Second * 2)

    //something doing here

    elapsed := time.Since(start)
    fmt.Printf("page took %s", elapsed)
}

Приведенный выше код отлично работает.

Но когда я использую шаблоны, я должен написать его снова для каждой функции шаблона.

Есть ли эффективный способ вычисления времени выполнения, включая шаблоны?

Ответ 1

Если вы синхронизируете всю функцию, вы можете использовать defer, чтобы удалить часть повторяющегося кода.

func elapsed(what string) func() {
    start := time.Now()
    return func() {
        fmt.Printf("%s took %v\n", what, time.Since(start))
    }
}

func main() {
    defer elapsed("page")()  // <-- The trailing () is the deferred call
    time.Sleep(time.Second * 2)
}

пример детской площадки

Ответ 2

Решение, предоставленное Cerise, является идеальным.


Кроме того, если вы не хотите явно передавать имя функции, вы можете выполнить это следующим образом:

func SomeFunction(list *[]string) {
    defer TimeTrack(time.Now())
    // Do whatever you want.
}

func TimeTrack(start time.Time) {
    elapsed := time.Since(start)

    // Skip this function, and fetch the PC and file for its parent.
    pc, _, _, _ := runtime.Caller(1)

    // Retrieve a function object this functions parent.
    funcObj := runtime.FuncForPC(pc)

    // Regex to extract just the function name (and not the module path).
    runtimeFunc := regexp.MustCompile('^.*\.(.*)$')
    name := runtimeFunc.ReplaceAllString(funcObj.Name(), "$1")

    log.Println(fmt.Sprintf("%s took %s", name, elapsed))
}

В результате вы получите:

SomeFunction took 15.483µs


Дополнительную информацию см. в этой статье: Отслеживание функций Go

Поделитесь знаниями. :)

Ответ 3

Используйте функцию init

package main

import (
    "fmt"
    "time"
)

var start time.Time

func init() {
    start = time.Now()
}

func getChars(s string) {
    for _, c := range s {
        fmt.Printf("%c at time %v\n", c, time.Since(start))
        time.Sleep(10 * time.Millisecond)
    }
}

func main() {
    fmt.Println("main execution started at time", time.Since(start))

    getChars("Hello")

    fmt.Println("\nmain execution stopped at time", time.Since(start))
}

Ответ 4

Эффективный способ рассчитать время выполнения в Голанге

Вы можете легко получить время выполнения на своей консоли, используя функцию отсрочки

Отложенные функции выполняются, даже если код получает ошибку, поэтому вы всегда получаете время выполнения.

пакет времени используется для получения разницы во времени.

func main() {
    now := time.Now()
    defer func() {
        fmt.Println(time.Now().Sub(now))
    }()

    // Here you can do whatever you want
}

Или вы можете использовать этот код

func main() {
        now := time.Now()
        defer func() {
            fmt.Println(time.Since(now))
        }()

        // Here you can do whatever you want
    }

проверьте код в игровой площадке, чтобы узнать больше. Я добавил некоторые функции для восстановления после ошибки и одновременно печатал время выполнения, даже если в случае ошибки паники.