【问题标题】:Measure the time of a child process测量子进程的时间
【发布时间】:2015-12-08 15:05:58
【问题描述】:

我想测量一个子进程的时间

#include <time.h>

int main() {
    ...
    time t begin, end, diff;
    ...
    //fork etc in here
    time(&begin);
    ...
    //some things
    ...
    time(&end);
    return 0;
}

我现在有 2 个时间戳,有没有办法将其格式化为子进程的运行时间为小时:分钟:秒?

我试过了

diff = end - begin;

但是我得到了一个巨大的数字。

(对不起,代码的一部分,但它在另一台电脑上。)

【问题讨论】:

  • 一个“巨大的数字”像什么?你能打印出“开始”和“结束”并告诉我们它们是什么吗?
  • 开始:2015 年 12 月 8 日星期二 15:15:28 结束:2015 年 12 月 8 日星期二 15:15:36 运行时间(差异):1449586236
  • 你是如何打印这些的?通常 time_t 是一个数字。你在什么操作系统上?
  • 创建一个MCVE 怎么样?
  • 我使用 ctime(&end) 例如打印开始/结束,我使用 linux

标签: c++


【解决方案1】:

您可以使用difftime 计算差异:

double diff_in_seconds = difftime(end, begin);

或者,为了获得更好的精度,请使用 C++11 chrono 单调时钟之一,例如 std::steady_clock

auto start = std::chrono::steady_clock::now();
// some things
auto end = std::chrono::steady_clock::now();
double time_in_seconds = std::chrono::duration_cast<double>(end - start).count();

另请参阅this answer,了解为什么应该使用单调时钟的详细信息。

【讨论】:

  • 你好,我刚试过。所以第一次是 16:27:47,第二次是 16:27:55。 difftime 的结果是 1.44959e+09。感谢第二种方式,但我想使用 time()
  • 什么和 diff = end 几乎一样——如果我将它转换为 int 就开始
  • 有趣。尝试在时间函数之后和 difftime 之前打印 begin 和 end 的值。也许它们在两者之间的某个地方被覆盖/损坏。
  • 好的,我刚试了一下,开始设置为 1970 年 1 月 1 日:D
  • 我非常修复它。我把时间(&开始)放在了错误的地方!
【解决方案2】:

您可能应该使用difftime 而不是减法来计算差异,以防您的系统使用除“整数秒数”之外的time_t 的其他格式。

difftimedouble 形式返回两次之间的秒数。然后,转换为小时、分钟和秒是一个简单的算术问题。

【讨论】:

  • 谢谢,但我得到的结果是 1.44959e+09,当 icast 到 int 时,它几乎和我的第一个结果一样。
  • @Raccoon20:那么您可能在其他地方有错误。让我重申我在评论中提出的发布 MCVE 的建议。
【解决方案3】:

问题中的尝试是 C 方式,而不是 C++。在 C++11 中(假设您有一个),您可以获得 2 个时间点,然后将它们之间的差异转换为您需要的单位,如下例所示:http://en.cppreference.com/w/cpp/chrono/duration/duration_cast

差点复制代码:

auto t1 = std::chrono::high_resolution_clock::now();
// Call your child process here
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << "Child process took "
          << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count()
          << " milliseconds\n";

【讨论】:

  • 这将返回完整的毫秒数,如果时间很短(毫秒级),这不是一个好主意。
  • @vitaut,如答案正文中所述,代码中有3项:1-2)获取时间点3)转换为某些单位。 OP 没有指定最方便的单位来测量他/她的子进程的运行时间,所以我只能猜测。运行时间短的大单元比运行时间长的小单元差。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多