gpt4 book ai didi

performance - 如何测量golang中函数的执行时间,不包括等待时间

转载 作者:数据小太阳 更新时间:2023-10-29 03:19:38 28 4
gpt4 key购买 nike

我有一个需求来测量go中插件的执行时间(cpu成本),我们可以将插件视为函数,可能同时运行多个goroutine。更准确地说,执行时间应该排除空闲时间(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 都没有找到线索,请问有什么解决方案可以满足我的需求,会不会占用太多资源?

最佳答案

Go 中没有内置的方法来测量 CPU 时间,但您可以通过特定于平台的方式来完成。

例如,在 POSIX 系统(例如 Linux)上使用 clock_gettime CLOCK_THREAD_CPUTIME_ID 作为参数。

同样,您可以使用 CLOCK_PROCESS_CPUTIME_ID 测量进程 CPU 时间,使用 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

请注意输出以纳秒为单位。所以这里的 CPU 时间是 0.03 秒。

关于performance - 如何测量golang中函数的执行时间,不包括等待时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55990074/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com