从方法C ++

时间:2016-05-27 19:16:16

标签: c++ performance time ros

我正在跟踪方法内部和方法之外的执行时间。我正在使用ROS来获取时间,因为这一切都在ROS包中,它非常方便。可以在此处找到文档:http://wiki.ros.org/roscpp/Overview/Time

void ClassName::my_method()
{
  ros::Time t_start = ros::Time::now();
  // do stuff
  ros::Duration d_execution = ros::Time::now() - t_start;
}

void ClassName::Func()
{
  ros::Time t_total = ros::Time::now();
  my_method();
  ros::Duration d_total = ros::Time::now() - t_total;
}

我遇到的问题是d_total总是比d_execution长得多。

d_execution通常为20-40微秒,但d_total大约为150微秒。

我无法弄清楚为什么会这样。我的理解是,在方法结束时发生的唯一事情是释放在方法中在堆栈上创建的任何内存。但是,我重新编写了代码,只创建了大约一半的变量,我看到d_total没有变化。还有什么可以让这个函数需要这么长时间才能返回?任何帮助表示赞赏。

编辑:我测量了ros :: Time :: now()的时间,它似乎可以忽略不计。

  time_t now, then;
  time(&now);
  ros::Time t = ros::Time::now();
  time(&then);
  printf("t1-t0: %f", difftime(now, then));

输出为“t1-t0:0.000000”。

此外,方法中堆栈上分配的所有变量都是双精度数。唯一的例外是两个std :: vector只包含2-3个元素。

2 个答案:

答案 0 :(得分:1)

与my_method()的确切版本有多大差异?

my_method是虚拟的吗?

当您进行性能测试时,它是一种更自然的方式来显示百分位数而不是平均值。

这是衡量差异的更正确方法:

void ClassName::my_method()
{
  ros::Time t_start = ros::Time::now();
  { // note this
  // do stuff
  } // and node this, destructors will be run before the next line
  ros::Duration d_execution = ros::Time::now() - t_start;
}

在Linux / OSX下,您可以尝试使用clock_gettime()我通常在性能测试中使用的内容。在C ++中,您可以尝试std :: chrono :: duration(http://en.cppreference.com/w/cpp/chrono/duration)。可能是ros ::时间有很大的抖动。

答案 1 :(得分:0)

返回时,一个方法调用析构函数,用于在其最顶层声明的所有内容。这些析构函数可能会调用更多析构函数,等等。

此外,在返回时,可以恢复寄存器值,但这几乎不需要100微秒。

通过更改堆栈指针值来释放堆栈内存,这非常快(可能是一个命令)。