C 在编译时发现可用的时钟类型

C 在编译时发现可用的时钟类型,c,gcc,clang,C,Gcc,Clang,[Ubuntu 14.04,3.16.0-34-通用内核,GCC 4.8.4,Clang 3.5.0] 我正在为我拥有的应用程序编写一些运行时间性能例程,我希望以跨平台的方式完成这些例程。 我希望以这样一种方式编写它:在编译期间选择正确的时钟类型,而不是在运行时(我可以通过测试失败和使用回退来完成) 时钟(2)手册页说明: 在具有这些功能的POSIX系统上,符号_POSIX_定时器定义为大于0的值。符号_POSIX_单调时钟,_POSIX_CPUTIME,_POSIX_线程_CPUTIME 指示

[Ubuntu 14.04,3.16.0-34-通用内核,GCC 4.8.4,Clang 3.5.0]

我正在为我拥有的应用程序编写一些运行时间性能例程,我希望以跨平台的方式完成这些例程。
我希望以这样一种方式编写它:在编译期间选择正确的时钟类型,而不是在运行时(我可以通过测试失败和使用回退来完成)

时钟(2)
手册页说明:

在具有这些功能的POSIX系统上,符号_POSIX_定时器定义为大于0的值。符号_POSIX_单调时钟,_POSIX_CPUTIME,_POSIX_线程_CPUTIME
指示时钟\u单调、时钟\u进程\u CPUTIME\u ID、时钟\u线程\u CPUTIME\u ID可用。(另请参见sysconf(3)。

我的代码中包含了条件编译语句,但我的条件编译语句无法识别符号
\u POSIX\u MONOTONIC\u CLOCK
。它总是打印“gettimeofday”消息。我尝试过GCC和Clang,但得到了相同的结果。
我下面的代码是不完整的(和不正确的),我将感谢一些帮助如何做到这一点的权利

#include <unistd.h>
#include <features.h>
#include <stdio.h>    // printf (otherwise forward declaration warning)
#include <stdlib.h>   // NULL
#include <sys/time.h>

long long get_utime(void)
{
        struct timeval tv;
        if (gettimeofday(&tv, NULL) == -1) return -1LL;

        long long t = (long long) tv.tv_usec +
                        (long long) tv.tv_sec * 1000000LL;
        return t;
}


int main() {

  union time{
    struct timespec tSpec;
    long long tLL;
  } myT;

#ifdef CLOCK_MONOTONIC_RAW
  clock_gettime(CLOCK_MONOTONIC_RAW, &myT.tSpec);
  printf("CLOCK_MONOTONIC_RAW\n");
#elif _POSIX_MONOTONIC_CLOCK
  clock_gettime(CLOCK_MONOTONIC, &myT.tSpec);
  printf("CLOCK_MONOTONIC\n");
#else
  myT.tLL = get_utime();
  printf("gettimeofday\n");
#endif // CLOCK_MONOTONIC_RAW

  return 0;
}
#包括
#包括
#include//printf(否则转发声明警告)
#include//NULL
#包括
长获取时间(无效)
{
结构时间值电视;
if(gettimeofday(&tv,NULL)=-1)返回-1LL;
long long t=(long long)tv.tv\u usec+
(长)tv.tv_sec*10000000000ll;
返回t;
}
int main(){
联合时间{
结构timespec tSpec;
长tLL;
}myT;
#ifdef时钟\u单调\u原始
时钟获取时间(时钟单调原始,和myT.tSpec);
printf(“时钟单调的原始数据”);
#elif_POSIX_单调时钟
时钟获取时间(时钟单调,&myT.tSpec);
printf(“时钟单调的”;
#否则
myT.tLL=get_utime();
printf(“gettimeofday\n”);
#endif//CLOCK\u单调\u原始
返回0;
}
我没有使用任何配置或自动配置软件


另外,关于CLOCK_monotic和CLOCK_monotic_RAW的相对速度的评论也不错。我理解它们的区别及其局限性。

您没有声明
man
页面上说您需要的标题和功能测试宏。这项工作:

#define _POSIX_C_SOURCE     200809L  // <- This was missing.
#define _XOPEN_SOURCE       700      // <- This is optional.

#include <unistd.h>
#include <stdio.h>    // printf (otherwise forward declaration warning)
#include <stdlib.h>   // NULL
#include <sys/time.h>
#include <time.h>     // <- This was missing.

long long get_utime(void)
{
        struct timeval tv;
        if (gettimeofday(&tv, NULL) == -1) return -1LL;

        long long t = (long long) tv.tv_usec +
                        (long long) tv.tv_sec * 1000000LL;
        return t;
}


int main() {

  union time{
    struct timespec tSpec;
    long long tLL;
  } myT;

#ifdef CLOCK_MONOTONIC_RAW
  clock_gettime(CLOCK_MONOTONIC_RAW, &myT.tSpec);
  printf("CLOCK_MONOTONIC_RAW\n");
#elif _POSIX_MONOTONIC_CLOCK
  clock_gettime(CLOCK_MONOTONIC, &myT.tSpec);
  printf("CLOCK_MONOTONIC\n");
#else
  myT.tLL = get_utime();
  printf("gettimeofday\n");
#endif // CLOCK_MONOTONIC_RAW

  return 0;
}

#define(定义)POSIX_C_SOURCE 200809L/)@Lorehead:(干杯)你能评论一下
时钟单调的
时钟单调的原始
的相对速度吗?恐怕不行。我从未使用过
CLOCK\u MONOTONIC\u RAW
,因为它的可移植性较差(POSIX标准定义了
CLOCK\u MONOTONIC
)。我不确定我是否理解你的问题:系统调用本身的性能并不重要,硬件时钟平均运行快还是慢将是硬件的一个特点。但是假设你的盒子的时钟跑得太快了1%。从文档中可以看出,
CLOCK\u MONOTONIC\u RAW
始终会告诉您运行得比实际速度快,而
CLOCK\u MONOTONIC
会在
ntp
同步时向后跳很多。定义
\u POSIX\u C\u SOURCE
有什么作用?我在任何
clock\u gettime
手册页中都没有看到这一行。@StefanFabian它是一个功能测试宏,可以启用POSIX标准2008版本中定义的所有扩展,并禁用一些不推荐使用的函数。这是来自POSIX而不是ISO C的函数,因此在某些实现中,您可能需要feature test宏来使用
clock\u gettime()
。在任何情况下,我都习惯于在包含在所有地方的头文件中声明为我编写的API编写的特性测试宏。