gpt4 book ai didi

c - 获取时间的便携方式

转载 作者:太空宇宙 更新时间:2023-11-03 23:24:09 25 4
gpt4 key购买 nike

由于 Mac OS X 不支持 get time,我在这里找到了一个使用 clock_gettime 基金的可移植方式的要点:

void current_utc_time(struct timespec *ts) {

#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
clock_serv_t cclock;
mach_timespec_t mts;
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock);
ts->tv_sec = mts.tv_sec;
ts->tv_nsec = mts.tv_nsec;
#else
clock_gettime(CLOCK_REALTIME, ts);
#endif
}

这样使用

struct timespec requestStart;
current_utc_time(&requestStart);
printf("start: s: %lu\n", requestStart.tv_sec);
printf("start: ns: %lu\n", requestStart.tv_nsec);
start: s: 1435988139
start: ns: 202015000

我正在尝试从此代码中获取秒和毫秒值,这是从纳秒值中获取毫秒值的正确方法吗?

printf("total: ms:  %lu\n", (requestStart.tv_nsec - requestEnd.tv_nsec) / (unsigned long)1000000);

如果是这样,我如何获得秒值?如果不是,我如何获得毫秒和秒值?

编辑作为对第一条评论的回应,我主要是在寻找一种使代码尽可能可移植的方法。

最佳答案

如果您想要可移植性,只需使用gettimeofday。这应该无处不在。 clock_gettime 似乎是 Linux 特定的一个相对较新的 Posix 介绍。

关于转换:struct timeval(由 gettimeofday 和其他旧函数使用)使用微秒。较新的 struct timespec 使用纳秒。因此,要来回转换,您需要乘以或除以 1000。

当计算差异时,你必须担心进位/溢出,所以你的表达式

(requestStart.tv_nsec - requestEnd.tv_nsec) / (unsigned long)1000000

不正确的原因有两个:差异可能会出现负数(也就是说,如果时间从 123.456 变为 124.321),并且您将其缩放得太多。

当我为一些操作计时时,我通常会这样做:

struct timeval before, after, elapsed;
gettimeofday(&before, NULL);
sleep(1);
gettimeofday(&after, NULL);
elapsed.tv_sec = after.tv_sec - before.tv_sec;
if(after.tv_usec >= before.tv_usec)
elapsed.tv_usec = after.tv_usec - before.tv_usec;
else {
elapsed.tv_sec--;
elapsed.tv_usec = 1000000 + after.tv_usec - before.tv_usec;
}
printf("elapsed: %d.%06ld\n", (int)elapsed.tv_sec, (long)elapsed.tv_usec);

如果我想要一个 struct timespec(使用纳秒),我会乘以 1000:

struct timespec elapsed2;
elapsed2.tv_sec = elapsed.tv_sec;
elapsed2.tv_nsec = elapsed.tv_usec * 1000;
printf("elapsed: %d.%09ld\n", (int)elapsed2.tv_sec, (long)elapsed2.tv_nsec);

要从 struct timespec 转换回 struct timeval,我会除以 1000:

struct timeval elapsed3;
elapsed3.tv_sec = elapsed2.tv_sec;
elapsed3.tv_usec = elapsed2.tv_nsec / 1000;

另一个有用的是将秒和亚秒作为 float 提取出来:

double e = (double)elapsed.tv_sec + elapsed.tv_usec / 1e6;
double e2 = (double)elapsed2.tv_sec + elapsed2.tv_nsec / 1e9;
printf("float: %f %f\n", e, e2);

(事实证明,在编写此类代码时可能会有微妙之处,具体取决于 tv_sectv_usectv_nsec,以及您的编译器可能选择给您的“有用”警告。参见 this question。)

关于c - 获取时间的便携方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217321/

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