【问题标题】:Behaviour of CLOCKS_PER_SEC in different Operating SystemsCLOCKS_PER_SEC 在不同操作系统中的行为
【发布时间】:2012-09-03 08:11:56
【问题描述】:

我正在运行一个 cpp 代码,但有一件事我注意到在 Windows 7 上,C++ 代码中的 CLOCKS_PER_SEC 给出 1000,而在 linux fedora 16 上它给出 1000000。任何人都可以证明这种行为是合理的吗?

【问题讨论】:

  • 这取决于您的操作系统上的时钟()实现,请参阅此问题以获取更多信息stackoverflow.com/questions/588307/…
  • 简单:如果它在实现之间没有变化,那么常量就不是必需的。它的存在是因为在这个 API 下提供什么样的计时器分辨率取决于实现。 Windows 每秒运行 1000 个滴答声

标签: c++ linux windows-7 fedora16


【解决方案1】:

要证明什么? CLOCKS_PER_SEC 是实现定义的,可以 成为任何东西。所有它都表示函数返回的单位 clock()。它甚至没有表明clock()的分辨率:Posix 无论实际分辨率如何,都要求它为 1000000。如果 Windows 返回 1000,这可能不是实际的分辨率 任何一个。 (我发现我的 Linux 机器的分辨率是 10 毫秒,而我的 Windows 机器是 15 毫秒。)

【讨论】:

  • ok.. 所以clock()函数与处理器的时钟速度无关,它只是计算进程所用的时间。我说的对吗?
  • @AkashdeepSaluja ...计算进程占用的 CPU 时间,而不是实时。参照。伟大的sleep 例子here
  • @AkashdeepSaluja 对。 clock() 是一种原始的基准测试工具。它返回任意值(但在我使用的系统上,第一次调用总是返回 0)。两次调用之间的差异返回两次调用之间使用的 CPU 时间,以 1 秒/CLOCKS_PER_SEC 为单位。 (但请注意,在 Windows 下,它将返回经过的时间,而不是 CPU 时间。)
【解决方案2】:

基本上clock()函数的实现对于不同的操作系统都有一定的余地。在 Linux Fedora 上,时钟走得更快。它每秒滴答 100 万次。

这个时钟滴答与 CPU 的时钟频率不同,在不同的抽象层上。 Windows 尝试使时钟滴答数等于 毫秒 的数量。

此宏扩展为表示时钟数的表达式 在一秒钟内滴答作响,由函数时钟返回。

将时钟滴答计数除以该表达式得出数字 秒。

CLK_TCK 是此宏的过时别名。

参考:http://www.cplusplus.com/reference/clibrary/ctime/CLOCKS_PER_SEC/

您还应该知道,Windows 实施不适用于真正的实时应用程序。 1000 滴答时钟是通过将硬件时钟除以 2 的幂得出的。这意味着它们实际上得到了 1024 滴答时钟。要将其转换为 1000 滴答时钟,Windows 将跳过某些滴答,这意味着某些滴答比其他滴答慢!

一个单独的硬件时钟(不是 CPU 时钟)通常用于计时。参考:http://en.wikipedia.org/wiki/Real-time_clock

【讨论】:

  • 老实说,最后一段没有意义。如果将 3.000.0000.000 Hz CPU 时钟频率除以 2 的幂,则不会得到 1024 Hz 时钟。对于 3.1 Ghz CPU,您会得到另一个结果。 IE。它只是不能像你解释的那样工作。
  • 此外,如今许多 CPU 甚至没有通过省电机制以固定速率运行,因此实时时钟通常不再计算时钟周期。
  • 我有点困惑,如果 CLOCKS_PER_SEC 与实际的 CPU 时钟不同,那么它到底给出了什么?
  • 对不起,@MSalters,我弄错了,它实际上使用了单独的硬件时钟,我更新了答案。
  • @AkashdeepSaluja 一个任意值,它定义了clock() 返回的单位。这就是你能说的所有内容(除了clock() 在 Windows 下不起作用——它应该返回 CPU 时间。)
猜你喜欢
  • 2018-02-02
  • 1970-01-01
  • 2019-10-06
  • 2017-03-19
  • 2023-04-09
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多