Как измерить время выполнения функции в голанге, исключая время ожидания - PullRequest
0 голосов
/ 05 мая 2019

У меня есть требование измерить время выполнения (стоимость процессора) плагинов на ходу, мы можем рассматривать плагины как функции, может быть много запущенных программ одновременно. Точнее, время выполнения должно исключать время простоя (время ожидания goroutine), только время получения CPU (текущей goroutine). это как:

go func(){
    // this func is a plugin
    ** start to record cpu acquire time of current func/plugin/goroutine **
    ** run code **
    ** stop to record cpu acquire time of current func/plugin/goroutine **
    log.Debugf("This function is buzy for %d millisecs.", cpuAcquireTime)
    ** report cpuAcquirTime to monitor **
}()

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

Я ищу в google и stackoverflow и не нахожу подсказки, есть ли какое-нибудь решение, чтобы удовлетворить мой спрос, и это занимает слишком много ресурсов?

1 Ответ

0 голосов
/ 08 мая 2019

В Go нет встроенного способа измерения времени процессора, но вы можете сделать это для платформы.

Например, в системах POSIX (например, Linux) используйте clock_gettime с CLOCK_THREAD_CPUTIME_ID в качестве параметра.

Аналогичным образом вы можете использовать CLOCK_PROCESS_CPUTIME_ID для измерения времени процессора и CLOCK_MONOTONIC для истекшего времени.

Пример:

package main

/*
#include <pthread.h>
#include <time.h>
#include <stdio.h>

static long long getThreadCpuTimeNs() {
    struct timespec t;
    if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &t)) {
        perror("clock_gettime");
        return 0;
    }
    return t.tv_sec * 1000000000LL + t.tv_nsec;
}
*/
import "C"
import "fmt"
import "time"

func main() {
    cputime1 := C.getThreadCpuTimeNs()
    doWork()
    cputime2 := C.getThreadCpuTimeNs()
    fmt.Printf("CPU time = %d ns\n", (cputime2 - cputime1))
}

func doWork() {
    x := 1
    for i := 0; i < 100000000; i++ {
        x *= 11111
    }
    time.Sleep(time.Second)
}

Вывод:

CPU time = 31250000 ns

Обратите внимание, что вывод в наносекундах.Таким образом, здесь время процессора составляет 0,03 сек.

...