获取从上一秒开始的经过的毫秒数
获取从上一秒开始的经过的毫秒数
我正在尝试使用time()来测量程序的不同点。\n我不明白的是为什么before和after的值是相同的?我知道这不是优化程序的最佳方法,我只想看看某个操作需要多长时间。\n
printf("**MyProgram::before time= %ld\n", time(NULL)); doSomething(); doSomethingLong(); printf("**MyProgram::after time= %ld\n", time(NULL));
\n我尝试过:\n
struct timeval diff, startTV, endTV; gettimeofday(&startTV, NULL); doSomething(); doSomethingLong(); gettimeofday(&endTV, NULL); timersub(&endTV, &startTV, &diff); printf("**time taken = %ld %ld\n", diff.tv_sec, diff.tv_usec);
\n如何读取**time taken = 0 26339
的结果?那意味着26,339纳秒=26.3毫秒吗?\n那**time taken = 4 45025
呢,那是4秒和25毫秒吗?
问题的出现原因:clock()函数只能精确到秒,而无法得到毫秒级的时间。
解决方法:使用更精确的方法来获取从上一秒开始的毫秒数。
整理成的文章如下:
clock()函数只能精确到秒,但是在一秒钟内有很多个时钟周期。尽管这种方法过于简化,但是它是一个简单而可移植的测量方法。
需要注意的是,clock()函数测量的是CPU时间,而不是实际经过的时间(实际经过的时间可能要长得多)。
在编写用于集群的并行代码时,这种方法无法反映真实世界的时间...
这似乎是最简单的方法。你愿意更新或回应之前的评论吗?
上述解决方法并不是一个好的解决方法,原因有很多。这是正确的答案 - stackoverflow.com/questions/2962785/…
我尝试了这个解决方法,正如评论所建议的那样,我的计时器比实际时间运行得快得多。
问题的出现原因:从上面的内容中可以看出,问题的出现是因为需要计算从上一秒开始的经过的毫秒数,这涉及到时间差的计算。
解决方法:根据上面的内容,可以总结出以下几种解决方法:
1. 使用delta函数计算时间差,代码如下:
auto start = std::chrono::steady_clock::now(); std::cout << "Elapsed(ms)=" << since(start).count() << std::endl; template < class result_t = std::chrono::milliseconds, class clock_t = std::chrono::steady_clock, class duration_t = std::chrono::milliseconds > auto since(std::chrono::time_pointconst& start) { return std::chrono::duration_cast (clock_t::now() - start); }
2. 使用基于std::chrono的计时器,代码如下:
Timer clock; // Timerclock.tick(); /* code you want to measure */ clock.tock(); cout << "Run time = " << clock.duration().count() << " ms\n"; template class Timer { using timep_t = typename ClockT::time_point; timep_t _start = ClockT::now(), _end = {}; public: void tick() { _end = timep_t{}; _start = ClockT::now(); } void tock() { _end = ClockT::now(); } template auto duration() const { gsl_Expects(_end != timep_t{} && "toc before reporting"); return std::chrono::duration_cast (_end - _start); } };
3. 可以对任何可调用对象进行性能测试,代码如下:
cout << "F runtime=" << measure<>::duration(F, arg1, arg2).count() << "ms"; templatestruct measure { template static auto duration(F&& func, Args&&... args) { auto start = ClockT::now(); std::invoke(std::forward (func), std::forward (args)...); return std::chrono::duration_cast (ClockT::now()-start); } };
计算从上一秒开始的经过的毫秒数可以通过使用delta函数、基于std::chrono的计时器或对任何可调用对象进行性能测试来实现。
其中,delta函数的实现如上述代码所示,通过获取起始时间点和当前时间点的时间差来计算经过的时间。
基于std::chrono的计时器的实现如上述代码所示,通过在代码开始和结束的位置记录时间点,并计算时间差来得到经过的时间。
对任何可调用对象进行性能测试的实现如上述代码所示,通过记录起始时间点和结束时间点,并计算时间差来得到经过的时间。
这些方法都可以用于计算从上一秒开始的经过的毫秒数。
问题出现的原因是需要获取从上一秒开始的经过的毫秒数,解决方法是使用C++11的chrono库来实现。
首先,需要引入#include <chrono>
指令,并使用std::chrono::steady_clock
来获取当前时间点。代码中的begin = std::chrono::steady_clock::now()
用于获取开始时间点,end = std::chrono::steady_clock::now()
用于获取结束时间点。
接下来,可以使用std::chrono::duration_cast
函数来计算时间差,并使用count()
函数获取时间差的值。例如,std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()
可以获取时间差的微秒数。
如果想要以秒为单位报告时间差,可以使用std::cout << "Time difference (sec) = " << (std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()) /1000000.0 <<std::endl;
来输出时间差的秒数。
在编译时,需要添加-std=c++11
标志来启用C++11的特性。
根据cppreference上的文档,std::chrono::steady_clock
与墙钟时间无关,适合用于测量时间间隔。
如果希望返回秒为单位的时间间隔,应该更仔细地查看std::chrono::duration_cast
函数,特别是std::chrono::seconds
。
std::chrono::duration_cast<std::chrono::microseconds>(end - begin).count()
返回的数据类型是std::chrono::microseconds::rep
,可以在chrono duration文档中找到相关类型。
这个问题的解答使用了完整的类型,而不是使用"auto",这样更容易理解。
,通过使用C++11的chrono库,可以方便地获取从上一秒开始的经过的毫秒数。