我使用boost::timer
为我的代码部分计时。如果我用一个线程运行代码:
$ time ./runfoo 1
Took 2.08s
real 0m2.086s
user 0m1.611s
sys 0m0.475s
2.08
是t.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
是实际的秒数过去。
答案 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。