【问题标题】:Long time to return from a method C++从 C++ 方法返回的时间很长
【发布时间】:2016-05-27 19:16:15
【问题描述】:

我正在跟踪方法本身和方法外部的执行时间。我正在使用 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”。

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

【问题讨论】:

  • 一个空的方法调用需要多长时间?
  • 你做了多少次测试?你检查汇编代码了吗?
  • 你在后台运行了多少任务?调度程序可能会导致延迟。
  • 注意:析构函数也在“函数返回之前”执行
  • 你给ros::Time::now()计时了吗?

标签: c++ performance time ros


【解决方案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::Time 有很大的抖动。

【讨论】:

  • 您好,我尝试了您的方法,但没有发现任何变化。感谢您提供有关如何正确测量差异的信息。
【解决方案2】:

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

此外,在返回时,寄存器值可能会被恢复,但这几乎不会花费 100 微秒。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 2011-04-03
    相关资源
    最近更新 更多