时间以微秒为单位,但在几秒钟内得到

时间:2015-01-15 20:56:19

标签: c++ ubuntu posix

通过读取Ubuntu下的系统时间,我遇到了一些问题。我试图得到两个ptime变量的区别。

这是我的声明:

#include "boost/date_time/posix_time/posix_time.hpp"

boost::posix_time::ptime now  = boost::posix_time::microsec_clock::universal_time();
boost::posix_time::ptime last_time = now;
boost::posix_time::time_duration dt;
...

一段时间后,我更新了now变量并构建差异

now  = boost::posix_time::second_clock::universal_time();
dt = last_time - now;

问题是我想在我的项目中以毫秒级分辨率工作,所以我将时间除以1000(将时间转换为微秒,如下所示)。

printf("%f", (double)dt.total_microseconds());

问题是我只获得了第二个分辨率的值。我已经尝试过local_time()而不是universal_time()。它没有解决我的问题...

你们有没有任何建议?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

在C ++ 11中,事情可以很容易地完成。

#include <chrono>
using std::chrono::high_resolution_clock;
using std::chrono::milliseconds;
using std::chrono::nanoseconds;

auto t0 = high_resolution_clock::now();

// do something here ...

auto t1 = high_resolution_clock::now();
// get miliseconds result.
milliseconds total_milliseconds = std::chrono::duration_cast<milliseconds>(t1 - t0);
// get nanoseconds result.
nanoseconds total_nanoseconds = std::chrono::duration_cast<nanoseconds>(t1 - t0);

答案 1 :(得分:1)

对于C ++ 11方式,请检查bames53的answer


这给出了以纳秒为单位的时间。在Ubuntu,C ++中,您需要将-lrt添加到链接到的库列表中。示例(在主文件中):

mm:main.cpp memory_manager.cc

g ++ -Wextra -Wall -Wreorder -o mm main.cpp memory_manager.cc -lrt

#include <cstdint> // C++11. Use #include <stdint.h> instead
#include <ctime>

int64_t timespecDiff(struct timespec *timeA_p, struct timespec *timeB_p)
{
  return (((int64_t)timeA_p->tv_sec * 1000000000) + timeA_p->tv_nsec) -
         (((int64_t)timeB_p->tv_sec * 1000000000) + timeB_p->tv_nsec);
}

struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);

/* Code to be measured */

clock_gettime(CLOCK_MONOTONIC, &end);
int64_t time;
time = timespecDiff(&end, &start);
std::cout<<"Time: " << time << " ns\n";

然后转换为ms。

我从我的例子here开始。


另一个有趣的方法,可能是你想要的一点点:

#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
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;
}

Source