1

我正在使用时钟(),我想知道它是否会重置或最大化。我使用它的目的只是太受先前函数调用的影响并找到不同之处。

感谢到目前为止的帮助,但我并不能真正让 chrono 在 VS '12 中工作,但它很好,因为我认为它比我需要的多一点,我正在考虑使用 's time() 但我不知道如何将 t_time 转换为仅包含当前秒数 0-60 的 int,有什么帮助吗?

4

3 回答 3

3

就标准而言,

可表示的时间范围和精度由clock_t实现time_t定义。

(C99,§7.23.1 ¶4)

所以不能保证范围;的定义clock()没有说任何关于环绕的内容,尽管它说

如果使用的处理器时间不可用或其值无法表示,则函数返回该值(clock_t)(-1)

所以我们可以说,超出范围clock_t可能被视为“它的值无法表示”;另一方面,这种解释意味着,一段时间后,它clock()变得完全无用。

事实上,如果我们深入到一个特定的实现(glibc),我们会看到:

matteo@teokubuntu:~$ man 3 clock
   Note that  the  time  can  wrap  around.   On  a  32-bit  system  where
   CLOCKS_PER_SEC  equals 1000000 this function will return the same value
   approximately every 72 minutes.
于 2013-06-14T22:36:58.220 回答
1

取决于你在什么系统上。它可能使用 32+ 或 64 位clock_t. 它肯定会翻转,但如果它是 64 位,在翻转之前的相当长一段时间内都可以使用 - 2 64微秒仍然是一个非常长的时间(大约 2 44秒,每天大约有 2 16秒,所以 2 28天 - 大约是 2 20或一百万年......;)

当然,在 32 位系统中,我们在微秒分辨率下大约有 2 12 =4096 秒。一小时为 3600 秒 = 约 1 小时 10 分。

但是,在某些系统中,另一个问题是clock()返回 CPU 使用时间,因此如果您休眠,它不会计入clock().

当然,即使CLOCKS_PER_SEC可能是 1000000,但这并不意味着您会得到微秒级的结果——在许多系统中,它一次“跳跃”10000 个单位。

总之,“可能是个坏主意”。

如果您的系统上有 C++11,请使用std::chrono,它有几个计时选项,对于大多数用途来说都足够好(但一定要研究std::chrono文档

示例代码:

#include <iostream>
#include <chrono>
#include <unistd.h>  // replace with "windows.h" if needed.

int main()
{
    std::chrono::time_point<std::chrono::system_clock> start, end;

    start = std::chrono::system_clock::now();
// 10 seconds on a unix system. Sleep(10000) on windows will be the same thing
    sleep(10);   
    end = std::chrono::system_clock::now();

    int elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>
                             (end-start).count();
    std::cout << "elapsed time: " << elapsed_seconds << "s\n";
}
于 2013-06-14T22:42:56.230 回答
0

简单的答案是,如果你只是用它来计时一个函数,它可能不会环绕。它也可能太慢,您可能会看到函数持续时间为零。如果您想要一个快速执行的函数的准确计时,您可能最好在 Windows 上使用像这样的操作系统级调用。

于 2013-06-14T23:32:24.213 回答