Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 便携式的时间获取方式_C_Loops_Timer - Fatal编程技术网

C 便携式的时间获取方式

C 便携式的时间获取方式,c,loops,timer,C,Loops,Timer,由于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(

由于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);
如果是,如何获取秒值?如果没有,如何获取毫秒和秒值

printf("total: ms:  %lu\n", (requestStart.tv_nsec - requestEnd.tv_nsec) / (unsigned long)1000000);
编辑 作为对第一条评论的回应,我主要是寻找一种使代码尽可能可移植的方法。

#import
#import <time.h>
#import <sys/timeb.h>

struct timeb timebCurrentTime;

ftime(&timebCurrentTime);
double y = (double)timebCurrentTime.time + (double)timebCurrentTime.millitm / 1000;//current time in sec since 1970-01-01 00:00:00 +0000 (UTC)
#进口 结构timeb timebCurrentTime; ftime(&timebCurrentTime); 双y=(双)timebCurrentTime.time+(双)timebCurrentTime.millitm/1000//自1970-01-01 00:00:00+0000(UTC)以来的当前时间(秒)
如果您想要便携性,只需使用
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;
另一个有用的方法是提取秒和亚秒作为浮点:

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_sec
tv_usec
tv_nsec
的实际类型,以及编译器可能选择给您的“有用”警告。请参见。)

这不是ANSI C:-)无论如何,真正的标准是ISO,ANSI只是当今的一个反馈机构。MacOS没有一个简单的界面来获取系统时间?真是难以置信@正如你从苹果官方文档中看到的,我使用了他们在上述函数中提供的计时器。这里是文档:我更关心的是从上面的函数将纳秒转换为秒和毫秒。您是否尝试链接到
-lrt
?clock_gettime(3)是一个兼容POSIX的函数,但在几种体系结构中,您必须将其链接或使用
\define\u POSIX_SOURCE
宏访问它。这是我见过的最详细的答案,对我帮助很大。因此,您可以从这些不同的时间结构进行转换。小调:
printf(“已用时间:%d.%09ld\n”,(int)elapsed2.tv_sec,(long)elapsed2.tv_nsec)
(long)
不需要强制转换,因为字段
tv\u nsec
被指定为
long
。铸造字段<代码>时间tvsSEC/ >代码> int >代码>可以很容易地被缩小:考虑<代码>“%LLD”,(long long)EAPSEDID.TVHSECSE/<代码>以避免1)您能添加一点解释吗?2)我想你指的是
#包含
,而不是
#导入