【问题标题】:Calculating time length between operations in c++计算c ++中操作之间的时间长度
【发布时间】:2011-05-25 14:01:31
【问题描述】:

程序是数据库和应用程序之间的中间件。对于每个数据库访问,我最常以毫秒为单位计算时间长度。下面的示例使用来自 Builder 库的 TDateTime。我必须尽可能只使用标准的 c++ 库。

AnsiString TimeInMilliseconds(TDateTime t) {
      Word Hour, Min, Sec, MSec;
      DecodeTime(t, Hour, Min, Sec, MSec);
      long ms = MSec + Sec * 1000 + Min * 1000 * 60 + Hour * 1000 * 60 * 60;
      return IntToStr(ms);
  }
  // computing times
   TDateTime SelectStart = Now();
   sql_manipulation_statement();
   TDateTime SelectEnd = Now();

【问题讨论】:

  • 是吗?不?也许?公交车司机几岁?
  • 如果没有澄清,我正在寻找一种方法来计算操作之间的毫秒时间长度

标签: c++ time tdatetime


【解决方案1】:

在 Windows 和 POSIX 兼容系统(Linux、OSX 等)上,您可以使用 <ctime> 中的 clock() 计算呼叫的时间(以 1/CLOCKS_PER_SEC(计时器滴答声)为单位)。该调用的返回值将是自程序开始运行以来经过的时间(以毫秒为单位)。然后可以将两个对clock() 的调用相减,以计算给定代码块的运行时间。

例如:

#include <ctime>
#include <cstdio>

clock_t time_a = clock();

//...run block of code

clock_t time_b = clock();

if (time_a == ((clock_t)-1) || time_b == ((clock_t)-1))
{
    perror("Unable to calculate elapsed time");
}
else
{
    unsigned int total_time_ticks = (unsigned int)(time_b - time_a);
}

编辑:您将无法直接比较从 POSIX 兼容平台到 Windows 平台的时间,因为在 Windows clock() 上测量挂钟时间,而在 POSIX 系统上,它测量经过的 CPU 时间。但它是标准 C++ 库中的一个函数,用于比较同一平台上不同代码块之间的性能,应该符合您的需求。

【讨论】:

  • 请注意,这给了 POSIX 系统上的 CPU 时间,据我所知,这给了 Windows 上的挂钟时间。 stackoverflow.com/questions/6114392/…
  • 在 C++ 中,实际上是在 ctime
  • @Fred Larson:正确,因此您无法直接将 Windows 机器上的时间与 POSIX 机器上的时间进行直接比较,但在这两个平台上,您将获得“基于时间的”应该满足 OP 对性能监控的需求的性能指标,它也在标准 C++ 库中。
  • 返回 0 次。我尝试了 long 而不是 unsigned int 但得到了 -1
  • 1) 在 POSIX 中,它不是毫秒,而是微秒。 2) 在 C 和 C++ 标准中,它不是微秒,而是 1/CLOCKS_PER_SEC 秒。
【解决方案2】:

在 Windows 上,您可以使用 GetTickCount (MSDN) 这将给出自系统启动以来经过的毫秒数。在通话前后使用它,您可以获得通话所用的毫秒数。

DWORD start = GetTickCount();
//Do your stuff
DWORD end = GetTickCount();
cout << "the call took " << (end - start) << " ms";

编辑: 正如杰森所说,Clock();会更好,因为它与 Windows 无关。

【讨论】:

  • 感谢您的回答。虽然我更喜欢使用 c++ 标准库
  • 确实,使用 Jason 的解决方案 :)
  • @PowerRoy 你知道使用时钟计数测量毫秒有多精确吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 2023-01-26
  • 2020-04-21
  • 1970-01-01
相关资源
最近更新 更多