我正在使用时钟(),我想知道它是否会重置或最大化。我使用它的目的只是太受先前函数调用的影响并找到不同之处。
感谢到目前为止的帮助,但我并不能真正让 chrono 在 VS '12 中工作,但它很好,因为我认为它比我需要的多一点,我正在考虑使用 's time() 但我不知道如何将 t_time 转换为仅包含当前秒数 0-60 的 int,有什么帮助吗?
就标准而言,
可表示的时间范围和精度由
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.
取决于你在什么系统上。它可能使用 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";
}
简单的答案是,如果你只是用它来计时一个函数,它可能不会环绕。它也可能太慢,您可能会看到函数持续时间为零。如果您想要一个快速执行的函数的准确计时,您可能最好在 Windows 上使用像这样的操作系统级调用。