【问题标题】:Measure time required to create thread测量创建线程所需的时间
【发布时间】:2012-05-02 15:17:57
【问题描述】:

如何测量创建和启动线程所需的时间? (Linux、pthreads 或 boost::thread)。

感谢您的建议!

【问题讨论】:

  • 你想通过这个实现什么?希望您不会尝试一些优化,因为您无法考虑这样的优化并且毫无意义。
  • 我需要在非常规基础上执行一些操作 - 在 30 毫秒后调用函数 X,在 15 毫秒后调用函数 Y,在 60 毫秒后调用 Z。这个函数应该在队列中发送消息。

标签: c++ linux multithreading boost pthreads


【解决方案1】:

您可能应该指定您想要测量的确切内容,因为至少有 2 种可能的解释(原始线程在 pthread_create 内“忙碌”的时间与从调用 pthread_create 到另一个线程实际执行的时间它的第一条指令)。

在任何一种情况下,您都可以在调用pthread_create 之前和之后或在调用之前使用clock_gettimeCLOCK_MONOTONIC 进行单调实时查询,并且作为线程函数中的第一件事。然后,从第一个值中减去第二个值。

要知道在phtread_create 中花费了多少时间,CLOCK_THREAD_CPUTIME_ID 是一种替代方法,因为它只计算线程使用的实际时间。

不过,总而言之,衡量这种事情有点毫无意义。它几乎什么也没有告诉你它在你的系统或另一个系统上的真实条件下会如何表现,具有未知的进程和未知的调度策略和优先级。
在另一台机器上,或者在另一天,您的线程可能只是在 100 或 200 毫秒后被安排。如果你相信这不会发生,你就死定了。

编辑:
关于上面评论中添加的信息,如果您需要在“正常调度量”范围内的规模上“非常规地执行操作”,您可以只创建一个线程和nanosleep 15 或30 毫秒。当然,睡眠并不是非常准确或可靠,因此您可能想要例如在timerfd 上阻塞(如果可移植性不是最高优先级,则使用信号传递计时器)。
使用单个计时器/等待来安排不规则的间隔也不是什么大问题,您只需要跟踪 next 事件何时到期。现代操作系统也是这样做的(阅读“计时器合并”)。

【讨论】:

  • ..而且,在许多应用程序中,它只是 N/A,因为它是启动时的一次性成本。
  • @MartinJames:是的,只有使用(非内核)aio 或 getaddrinfo_a 或 libunbound 或类似(所有这些都在不可预测的时间产生线程)的应用程序才真正有趣(如果有的话)。然后,无论如何你都无能为力......
猜你喜欢
  • 2014-12-06
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2011-06-15
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多