C++ time()和time.h是单调的吗?

C++ time()和time.h是单调的吗?,c++,performance,time,C++,Performance,Time,我说的是老式的时间函数,它返回自纪元以来的秒数,单位为UTC。这应该是单调的,对吧 在我下面的测试中,它的运行速度比clock_单调的clock_gettime快10倍左右,所以我想知道它是否可以用作单调计时器,用于需要低延迟低分辨率单调计时器的情况。e、 g.断开服务器上已存在超过15秒的连接 以下是代码,以防您好奇: #include <cstdio> #include <chrono> #include <time.h> #include <sys

我说的是老式的时间函数,它返回自纪元以来的秒数,单位为UTC。这应该是单调的,对吧

在我下面的测试中,它的运行速度比clock_单调的clock_gettime快10倍左右,所以我想知道它是否可以用作单调计时器,用于需要低延迟低分辨率单调计时器的情况。e、 g.断开服务器上已存在超过15秒的连接

以下是代码,以防您好奇:

#include <cstdio>
#include <chrono>
#include <time.h>
#include <sys/time.h>
#include <x86intrin.h>

using namespace std;

class Timer {
    std::chrono::time_point<std::chrono::steady_clock> start;
public:
    inline double t() {
        auto end = std::chrono::steady_clock::now();
        std::chrono::duration<double> diff = end - start;
        return diff.count();
    }
    inline double milli() { return t() * 1000.0;}
    Timer() :start(std::chrono::steady_clock::now()) {}
};

const int nloop = 10000000;

void cpp_steady() {
    for (int i=0;i<nloop;i++) {
        chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
    }
}

void get_tod() {
    timeval tv;
    for (int i=0;i<nloop;i++) {
        gettimeofday(&tv, 0);
    }
}

void get_clock() {
    for (int i=0;i<nloop;i++) {
        clock_t t = clock();
    }
}

void get_time() {
    int x =0;
    for (int i=0;i<nloop;i++) {
        time_t t = time(0);
        x+=t*3;
    }
    fprintf(stderr,"%d\n",x);    
}

void get_clock_gettime() {
    timespec ts;
    for (int i=0;i<nloop;i++) {
        clock_gettime(CLOCK_MONOTONIC, &ts);
    }
}

void get_rdtsc() {
    for (int i=0;i<nloop;i++) {
        __rdtsc();
    }
}

void emptyloop() {
    int x=0;
    for (int i=0;i<nloop;i++) {
        x+=3*i;
    }
    fprintf(stderr,"%d\n",x);
}

void measure(const char *name, void (*f)()) {
    Timer t;
    f();
    double dur = t.milli();
    printf(" %-15s : %.3f ms\n", name, dur);
}

int main () {

    measure("cpp_steady", cpp_steady);
    measure("gettimeofday", get_tod);
    //measure("clock", get_clock);  //too fking slow
    measure("time", get_time);
    measure("clock_gettime", get_clock_gettime);
    measure("rdtsc", get_rdtsc);
    measure("empty", emptyloop);

    return 0;
}

顺便说一句,我知道这只是几纳秒的问题,其实并不重要,但实际上时间消耗的内存更少,比其他选择更便于携带……

除了时间不一定是单调的外,没有明确的答案


它只返回内核认为当前时间是什么。如果有操作程序来保证时钟永远不会倒转,如果遵守这些程序,那么它应该是单调的。例如,在使用ntpd进行时间同步的Unix设备上,时钟不应向后运行。但是,如果在机器上拥有管理员权限的管理员发现机器时间不准确,并将其向后修正,那么任何单调的假设都是错误的。

除了时间不一定是单调的外,没有明确的答案


它只返回内核认为当前时间是什么。如果有操作程序来保证时钟永远不会倒转,如果遵守这些程序,那么它应该是单调的。例如,在使用ntpd进行时间同步的Unix设备上,时钟不应向后运行。但是,如果在机器上具有管理员权限的管理员发现机器时间不准确并将其向后修正,则任何单调的假设都将是错误的。

返回值的编码未指定。但是,在大多数实现中,它返回自unix时代以来的当前墙时间(以秒为单位)


如果你的挂钟是单调的,那么std::时间也将是单调的。然而,挂钟通常不能保证是单调的。许多现代Linux系统使用时钟涂抹(clock smearing)而不是向后跳来调整其时钟到NTP源,但即使在这种情况下,用户也可以干预并手动向后设置时钟。

未指定从NTP源返回的值的编码。但是,在大多数实现中,它返回自unix时代以来的当前墙时间(以秒为单位)


如果你的挂钟是单调的,那么std::时间也将是单调的。然而,挂钟通常不能保证是单调的。许多现代Linux系统使用时钟涂抹(clock smearing)而不是向后跳来根据NTP源调整时钟,但即使在这种情况下,用户也可以干预并手动向后设置时钟。

这应该是单调的,对吗?不,这应该是单调的,对吧?不,好的,但如果用户是我,我不改变时钟,系统是现代Linux,那么它是单调的,对吗?你需要检查你自己,你的挂钟是单调的,它取决于使用中的NTP守护进程及其配置好的,但如果用户是我,我不改变时钟,系统是现代Linux,那么它是单调的,对吗?你需要检查你自己,你的挂钟是单调的,它取决于正在使用的NTP守护进程及其配置,所以要小心秒。至少有4个选项-闰秒正确完成UTC,闰秒回滚,导致闰秒期间发生的时间在1秒后重复;闰秒不存在,一秒比一秒稍长——不是UTC;闰秒被抹掉了,大多数秒都是一秒,但一年中的某一天你可能会得到超长的秒数。同样要提防秒数。至少有4个选项-闰秒正确完成UTC,闰秒回滚,导致闰秒期间发生的时间在1秒后重复;闰秒不存在,一秒比一秒稍长——不是UTC;闰秒被抹掉了,大多数秒是一秒,但一年中的某一天你可能会得到更长的秒。
./clk_bench 2>/dev/null
 cpp_steady      : 212.415 ms
 gettimeofday    : 200.733 ms
 time            : 19.526 ms
 clock_gettime   : 197.791 ms
 rdtsc           : 75.169 ms
 empty           : 2.821 ms