英文:
Get monotonic time, same as CLOCK_MONOTONIC
问题
你可以使用Go语言中的time
包来获取从启动开始的单调时间(以纳秒为单位)。以下是一个示例代码:
package main
import (
"fmt"
"time"
)
func getNsecs() uint64 {
ts := time.Now().UnixNano()
return uint64(ts)
}
func main() {
nsecs := getNsecs()
fmt.Println(nsecs)
}
在上面的代码中,getNsecs
函数使用time.Now().UnixNano()
来获取当前时间的纳秒表示。它返回一个uint64
类型的值,表示从启动开始的单调时间。你可以在main
函数中调用getNsecs
函数来获取并打印这个值。
请注意,Go语言中的时间函数返回的是当前时间,而不是从启动开始的时间。因此,你需要使用当前时间减去启动时间来获取从启动开始的单调时间。
英文:
How can I get the monotonic time from boot in nanoseconds in Go? I need the same value that the following C code would return:
static unsigned long get_nsecs(void)
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return ts.tv_sec * 1000000000UL + ts.tv_nsec;
}
The functions in the time
package seem to return the current time and/or date.
答案1
得分: 4
使用Go语言的cgo功能。
使用unsigned long long
来确保纳秒级的64位整数值。例如,在Windows上,unsigned long
是一个32位整数值。
monotonic.go
文件内容如下:
package main
import "fmt"
/*
#include <time.h>
static unsigned long long get_nsecs(void)
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (unsigned long long)ts.tv_sec * 1000000000UL + ts.tv_nsec;
}
*/
import "C"
func main() {
monotonic := uint64(C.get_nsecs())
fmt.Println(monotonic)
}
运行以下命令:
$ go run monotonic.go
10675342462493
$
英文:
Use Go with cgo.
Use unsigned long long
to guarantee a 64-bit integer value for nanoseconds. For example, on Windows, unsigned long
is a 32-bit integer value.
monotonic.go
:
package main
import "fmt"
/*
#include <time.h>
static unsigned long long get_nsecs(void)
{
struct timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (unsigned long long)ts.tv_sec * 1000000000UL + ts.tv_nsec;
}
*/
import "C"
func main() {
monotonic := uint64(C.get_nsecs())
fmt.Println(monotonic)
}
$ go run monotonic.go
10675342462493
$
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论