当前位置:  开发笔记 > 编程语言 > 正文

C++在Linux上获得毫秒时间 - clock()似乎无法正常工作

如何解决《C++在Linux上获得毫秒时间-clock()似乎无法正常工作》经验,为你挑选了6个好方法。

在Windows上,clock()以毫秒为单位返回时间,但是在我正在处理的这个Linux机器上,它将它舍入到最接近的1000,因此精度仅为"秒"级别而不是毫秒级别.

我找到了一个使用QTime该类的Qt解决方案,实例化一个对象并调用start()它然后调用elapsed()以获得经过的毫秒数.

我有点幸运,因为我开始使用Qt,但我想要一个不依赖第三方库的解决方案,

有没有标准的方法来做到这一点?

UPDATE

请不要推荐Boost ..

如果Boost和Qt可以做到这一点,那肯定不是魔术,必须有他们正在使用的标准!



1> CTT..:
#include 
#include 
#include 
int main()
{
    struct timeval start, end;

    long mtime, seconds, useconds;    

    gettimeofday(&start, NULL);
    usleep(2000);
    gettimeofday(&end, NULL);

    seconds  = end.tv_sec  - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;

    mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;

    printf("Elapsed time: %ld milliseconds\n", mtime);

    return 0;
}


@Computer Guru,这是一种用于舍入正值的常用技术.当值被截断为整数值时,0.0到0.4999之间的任何内容......在添加之前被截断为0,并且在0.5和0.9999之间...被截断为1.
@AndrewStone是对的,使用带有CLOCK_REALTIME的clock_gettime(2)来比较同一台计算机上的时间.从gettimeofday(2)联机帮助页:`POSIX.1-2008标记gettimeofday()已过时,建议使用clock_gettime(2)而不是.@ CTT,你可以通过将`struct timeval`更改为`struct来更新示例timespec`和`gettimeofday(&start,NULL)`到`clock_gettime(CLOCK_MONOTONIC,&start)`这样人们就不会遇到麻烦了?
认真工作很可怕.每年两次大问题,有人做日期-s,当然还有NTP同步
tv_usec不是毫秒,它是微秒.
你为什么要加差异+0.5?
@Bobby Powers:MacOS用户警告:MacOS没有clock_gettime().

2> Johannes Sch..:

请注意,clock不能衡量挂钟的时间.这意味着如果您的程序需要5秒钟,clock则不一定会测量5秒,但可能会更多(您的程序可以运行多个线程,因此可能会消耗比实时更多的CPU)或更少.它测量所用CPU时间的近似值.要查看差异,请考虑此代码

#include 
#include 
#include 

int main() {
    std::clock_t a = std::clock();
    sleep(5); // sleep 5s
    std::clock_t b = std::clock();

    std::cout << "difference: " << (b - a) << std::endl;
    return 0;
}

它在我的系统上输出

$ difference: 0

因为我们所做的就是睡觉而不使用任何CPU时间!然而,使用gettimeofday我们得到我们想要的东西(?)

#include 
#include 
#include 
#include 

int main() {
    timeval a;
    timeval b;

    gettimeofday(&a, 0);
    sleep(5); // sleep 5s
    gettimeofday(&b, 0);

    std::cout << "difference: " << (b.tv_sec - a.tv_sec) << std::endl;
    return 0;
}

我的系统输出

$ difference: 5

如果您需要更高的精度但想要获得CPU时间,那么您可以考虑使用该getrusage功能.



3> Adam Hawes..:

您可以在方法的开头和结尾使用gettimeofday,然后区分两个返回结构.您将获得如下结构:

struct timeval {
  time_t tv_sec;
  suseconds_t tv_usec;
}


认真工作很可怕.每年两次大问题,有人做日期-s,当然还有NTP同步.使用clock_gettime(CLOCK_MONOTONIC,)
@AndrewStone:UNIX时间每年不会改变两次.甚至每年一次.但是,是的,`CLOCK_MONOTONIC`非常适合避免本地化的系统时间调整.

4> Anonymous..:

我还推荐Boost提供的工具.无论是提到的Boost Timer,还是Boost.DateTime中的东西,或者沙盒中都有新的提议库 - Boost.Chrono:这最后一个将是Timer的替代品,并将具有以下功能:

C++ 0x标准库的时间实用程序,包括:

类模板 duration

类模板 time_point

钟:

system_clock

monotonic_clock

high_resolution_clock

类模板timer,带有typedef:

system_timer

monotonic_timer

high_resolution_timer

处理时钟和定时器:

process_clock捕获实际,用户CPU和系统CPU时间.

process_timer,捕获经过的实际,用户CPU和系统CPU时间.

run_timer,方便的报告| process_timer | 结果.

C++ 0x标准库的编译时有理算术.

这是功能列表的来源



5> Chris Redfor..:

Timer根据CTT的答案写了一堂课.它可以通过以下方式使用:

Timer timer = Timer();
timer.start();
/* perform task */
double duration = timer.stop();
timer.printTime(duration);

这是它的实现:

#include 
#include 
#include 
using namespace std;

class Timer {
private:

    timeval startTime;

public:

    void start(){
        gettimeofday(&startTime, NULL);
    }

    double stop(){
        timeval endTime;
        long seconds, useconds;
        double duration;

        gettimeofday(&endTime, NULL);

        seconds  = endTime.tv_sec  - startTime.tv_sec;
        useconds = endTime.tv_usec - startTime.tv_usec;

        duration = seconds + useconds/1000000.0;

        return duration;
    }

    static void printTime(double duration){
        printf("%5.6f seconds\n", duration);
    }
};


这很酷,但"nseconds"会产生误导,因为timeval不会持有纳秒,它会持续几微秒,所以我建议人们称之为"useconds".

6> Zachary Hamm..:

如果您不需要将代码移植到旧的unices,则可以使用clock_gettime(),这将为您提供以纳秒为单位的时间(如果您的处理器支持该分辨率).它是POSIX,但是从2001年开始.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有