C++ 计算时间增量最快的LinuxC时间函数是什么?看到clock_gettime和gettimeofday性能不佳

C++ 计算时间增量最快的LinuxC时间函数是什么?看到clock_gettime和gettimeofday性能不佳,c++,c,linux,C++,C,Linux,我在写一个剖析器,它的用例是 long getTiming() { long start = someGetTimeFunction(); executeSomething(); return someTimeFunction() - start; } 无论我使用了什么时间函数,它似乎都会增加大量开销。我尝试了gettimeofday(),clock\u gettime()使用clock\u单调、clock\u进程\u CPUTIME\u ID和clock\u线程\u

我在写一个剖析器,它的用例是

long getTiming() 
{
    long start = someGetTimeFunction();
    executeSomething();
    return someTimeFunction() - start;
}
无论我使用了什么时间函数,它似乎都会增加大量开销。我尝试了
gettimeofday()
clock\u gettime()
使用
clock\u单调、clock\u进程\u CPUTIME\u ID
clock\u线程\u CPUTIME\u ID
,我还尝试了一点我发现的程序集来调用
rdtsc

每个运营商的运营成本为500000美元,以下是他们的成本:

[INFO] [       OK ] X.TimeGetTimeOfDay (1165 ms)

[INFO] [       OK ] X.TimeRdtscl (1208 ms)

[INFO] [       OK ] X.TimeMonotomicGetTime (1536 ms)

[INFO] [       OK ] X.TimeProcessGetTime (1575 ms)

[INFO] [       OK ] X.TimeThreadGetTime (1522 ms)
这是在macbook pro上运行的CentOS 5虚拟机上

因为我需要计算delta,所以我不需要绝对时间。而且,在smp系统上比较不同内核或CPU上获得的时间也没有风险

我能做得更好吗

以下是我的测试用例:

TEST(X, TimeGetTimeOfDay)
{    
    for (int i = 0; i < 500000; i++) {
        timeval when;
        gettimeofday(&when, NULL);
    }
}

TEST(X, TimeRdtscl)
{
    for (int i = 0; i < 500000; i++) {
        unsigned long long when;
        rdtscl(&when);
    }
}

TEST(X, TimeMonotomicGetTime)
{
    for (int i = 0; i < 500000; i++) {
        struct timespec when;
        clock_gettime(CLOCK_MONOTONIC, &when);
    }
}

TEST(X, TimeProcessGetTime)
{
    for (int i = 0; i < 500000; i++) {
        struct timespec when;
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &when);
    }
}


TEST(X, TimeThreadGetTime)
{
    for (int i = 0; i < 500000; i++) {
        struct timespec when;
        clock_gettime(CLOCK_THREAD_CPUTIME_ID, &when);
    }
}
TEST(X,TimeGetTimeOfDay)
{    
对于(int i=0;i<500000;i++){
timeval何时;
gettimeofday(&when,NULL);
}
}
测试(X,TimeRdtscl)
{
对于(int i=0;i<500000;i++){
无符号长时;
rdtscl(&何时);
}
}
测试(X,timemonoticgettime)
{
对于(int i=0;i<500000;i++){
结构timespec when;
时钟获取时间(时钟单调,&何时);
}
}
测试(X,TimeProcessGetTime)
{
对于(int i=0;i<500000;i++){
结构timespec when;
时钟获取时间(时钟处理时间ID和时间);
}
}
测试(X,TimeThreadGetTime)
{
对于(int i=0;i<500000;i++){
结构timespec when;
时钟获取时间(时钟线程CPU使用时间ID和时间);
}
}
这是我收到的rdtsc

inline void rdtscl(无符号长*t)
{
无符号长l,h;
__asm_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;

*t=((unsigned long)l)|((unsigned long)h)我创建了一个单独的线程,它每1ms更新一次boost::atomic long

我的执行线程读取这么长的时间戳


吞吐量要高得多。

因此,您观察到每次呼叫的开销高达0.00315ms。如果某个任务的执行速度明显加快,甚至接近该时间,则该任务的执行速度非常快。您确定这确实有问题吗?(我不确定普通PC是否可以使用更小的时间间隔。)您应该阅读并安排您的基准测试,以测量运行时间超过100毫秒的函数。@BaummitAugen我正在计时的函数速度大致相同,它们实际上也能工作。因此,通过计时,我增加了100%的开销。我希望做得更好。@marathon在这种情况下,我建议您重新安排基准测试以测量时间它足够大,以至于开销无关紧要,就像让函数更频繁地运行一样。我很确定,一台普通的计算机无论如何都不能精确地测量这么小的时间间隔。
inline void rdtscl(unsigned long long *t)
{
    unsigned long long l, h;
    __asm__ __volatile__ ("rdtsc" : "=a"(l), "=d"(h));
    *t = ( (unsigned long long)l)|( ((unsigned long long)h) <<32 );
}