如何使用boost来跟踪实时而不是用户+ sys?

时间:2014-04-25 22:40:18

标签: c++ multithreading boost timer

我使用boost::timer为我的代码部分计时。如果我用一个线程运行代码:

$ time ./runfoo 1
Took 2.08s

real    0m2.086s
user    0m1.611s
sys     0m0.475s

2.08t.elapsed()的输出。

然而,如果我用4个线程运行代码:

$ time ./runfoo 4
Took 2.47s

real    0m1.022s
user    0m1.834s
sys     0m0.628s

似乎是跟踪用户+系统时间,而不是实时。

如何让它实时跟踪?我正在使用Boost 1.46。更具体地说,计时器位于主线程中,它只调用最终使用多个线程的函数。

编辑:相关来源看起来像这样:

boost::asio::io_service ios;
boost::thread_group pool; 
boost::asio::io_service::work work(ios);
pool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService));
pool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService));
pool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService));
pool.create_thread(boost::bind(&boost::asio::io_service::run, &ioService));
{
    boost::timer t;

    function_which_posts_to_ios(ios);

    printf("Took %.2fs\n", t.elapsed();
}

至于我期望的输出,我希望第二轮中的程序打印"Took 1.02s"而不是"Took 2.47s",因为1.02s是实际的秒数过去。

1 个答案:

答案 0 :(得分:2)

您似乎正在使用deprecated Version 1 timers,其中elapsed()的语义在各个平台上不一致,某些时间的挂钟时间和其他时间的CPU时间不一致。在Version 2 cpu_timer中,elapsed()方法返回一个结构,该结构具有真实,用户和系统时间的不同成员。

如果您无法使用版本2 API,则可以使用boost::posix_time代替测量挂钟时间。请参阅c++ boost get current time in milliseconds