你能解释一下Linux上返回的时钟CLOCK_REALTIME和CLOCK_MONOTONIC时钟之间的区别clock_gettime()吗?
如果我需要计算外部源产生的时间戳与当前时间之间的经过时间,那么哪个是更好的选择?
最后,如果我有一个NTP守护进程周期性地调整系统时间,如何做这些调整与每个交互CLOCK_REALTIME和CLOCK_MONOTONIC?
其中计时功能,time,clock getrusage,clock_gettime,gettimeofday和timespec_get,我想清楚地了解它们是如何实现的,为了知道在什么情况下我必须使用他们什么是他们的返回值.
首先,我们需要对返回wall-clock值的函数进行分类,与返回进程或线程值的函数进行比较.gettimeofday返回wall-clock值,clock_gettime返回wall-clock值或进程或线程值,具体取决于Clock传递给它的参数.getrusage并clock返回过程值.
然后第二个问题涉及这些功能的实施,因此,它们的准确性.这些功能使用哪种硬件或软件机制.
似乎getrusage只使用内核tick(通常为1ms长),因此不能比ms更准确.这样对吗?然后该getimeofday函数似乎使用最准确的底层硬件.因此,它的准确性通常是近期硬件上的微秒(因为API而不能更多).那么clock,手册页谈的是"近似",它是什么意思?那么clock_gettime,API是纳秒级,是否意味着如果底层硬件允许它,它能够如此准确?单调性怎么样?
还有其他功能吗?
让我通过这个测试程序问我的问题:
#include <iostream>
#include <chrono>
using std::chrono::nanoseconds;
using std::chrono::duration_cast;
int main(int argc, char* argv[])
{
std::cout << "resolution (nano) = " << (double) std::chrono::high_resolution_clock::period::num
/ std::chrono::high_resolution_clock::period::den * 1000 * 1000 * 1000 << std::endl;
auto t1 = std::chrono::high_resolution_clock::now();
std::cout << "how much nanoseconds std::cout takes?" << std::endl;
auto t2 = std::chrono::high_resolution_clock::now();
auto diff = t2-t1;
nanoseconds ns = duration_cast<nanoseconds>(diff);
std::cout << "std::cout takes " << ns.count() << " nanoseconds" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我机器上的输出:
分辨率(纳米)= 100
std :: cout需要多少纳秒? …
我试图通过查看数据的时间戳来查看我的数据是否是120秒旧,所以我有以下代码:
uint64_t now = duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();
bool is_old = (120 * 1000 < (now - data_holder->getTimestamp()));
Run Code Online (Sandbox Code Playgroud)
在上面的代码中data_holder->getTimestamp()是uint64_t,它返回以毫秒为单位的时间戳.
现在,当我打印出now变量值时,我看到了这一点10011360,当我打印出data_holder->getTimestamp()值时,1437520382241现在的差异和数据持有者时间戳应该是负的吗?为什么它会像下面的日志中显示的那样积极?
2015-07-21 16:13:02,530 WARN 0x7f35312d1700 data_check - now value: 10011360 , data holder timestamp: 1437520382241 , difference: 18446742636199180735
Run Code Online (Sandbox Code Playgroud)
我上面的代码是否正确?从上面的数据持有者时间戳,它看起来不是120秒的旧数据,所以我觉得我的代码有问题吗?因为如果我将数据持有者时间戳转换为实际时间(使用纪元转换器),然后将其与日志时间进行比较,如上所示,它几乎相同.
我正在使用steady_clock如上所示.我需要在system_clock这里使用吗?在外行人的条款中,steady_clockvs 之间有什么区别system_clock.我在Ubuntu 14.04框上运行此代码.
我有一段代码,在Windows上运行速度比在linux上快2倍.这是我测量的时间:
g++ -Ofast -march=native -m64
29.1123
g++ -Ofast -march=native
29.0497
clang++ -Ofast -march=native
28.9192
visual studio 2013 Debug 32b
13.8802
visual studio 2013 Release 32b
12.5569
Run Code Online (Sandbox Code Playgroud)
这似乎是一个太大的差异.
这是代码:
#include <iostream>
#include <map>
#include <chrono>
static std::size_t Count = 1000;
static std::size_t MaxNum = 50000000;
bool IsPrime(std::size_t num)
{
for (std::size_t i = 2; i < num; i++)
{
if (num % i == 0)
return false;
}
return true;
}
int main()
{
auto start = std::chrono::steady_clock::now();
std::map<std::size_t, bool> value; …Run Code Online (Sandbox Code Playgroud) 我的app服务器代码中有一行代码,它使用steady_clock如下所示的时间戳值:
uint64_t now = duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();
Run Code Online (Sandbox Code Playgroud)
现在我们有两个正在运行的Ubuntu 12 (gcc 4.6.3 compiler)systemA 机器和正在运行的machineB Ubuntu 14 (gcc 4.8.2 compiler).
现在我们使用另一个 make编译我们的app服务器代码Ubuntu 12 VM (which has 4.7.3 compiler),然后将生成的tar文件复制到machineA并启动我们的app服务器.在开始之后,上面的代码行在machineA中打印出如下值:
1439944652967
Run Code Online (Sandbox Code Playgroud)
现在我们还使用另一个 make编译相同的应用服务器代码Ubuntu 14 VM (which has 4.8.2 compiler),然后将生成的tar文件复制到machineB并启动我们的app服务器.在开始之后,上面的代码行在machineB中打印出这样的值:
10011360
Run Code Online (Sandbox Code Playgroud)
你看到差异吧?我很困惑为什么这是差异,我无法理解这一点?所有代码和一切都是一样的.有没有人对此有任何解释,我该如何解决?
如果需要,我可以尝试添加一些调试代码,看看弄清楚这个问题有什么不对.
对于游戏,我想测量自上一帧以来经过的时间。
我曾经glutGet(GLUT_ELAPSED_TIME)这样做过。但是在包含 glew 之后,编译器再也找不到 glutGet 函数了(奇怪)。所以我需要一个替代方案。
到目前为止,我发现的大多数网站都建议在 ctime 中使用时钟,但该功能仅测量程序的 CPU 时间,而不是实时时间!ctime 中的时间函数只精确到秒。我需要至少毫秒精度。
我可以使用 C++11。
在C++中计算经过时间的最准确方法是什么?我使用clock()来计算这个,但我感觉这是错误的,因为我得到0 ms 90%的时间和15 ms其余部分对我来说没什么意义.
即使它非常小并且非常接近0 ms,是否有更精确的方法可以给出精确的值而不是向下舍入0 ms?
clock_t tic = clock();
/*
main programme body
*/
clock_t toc = clock();
double time = (double)(toc-tic);
cout << "\nTime taken: " << (1000*(time/CLOCKS_PER_SEC)) << " (ms)";
Run Code Online (Sandbox Code Playgroud)
谢谢
以下程序:
#include <chrono>
#include <iostream>
#include <vector>
inline uint64_t now() {
return std::chrono::duration_cast
<std::chrono::nanoseconds>
(std::chrono::system_clock::now()
.time_since_epoch())
.count();
}
int main() {
std::vector<uint64_t> v;
for (int i = 0; i < 1000; i++)
v.push_back(now());
for (int i = 0; i < v.size()-1; i++)
std::cout << v[i+1] - v[i] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在以下位置打印大约 250 到 300 范围内的数字:
g++ (Ubuntu 8.2.0-7ubuntu1) 8.2.0
Run Code Online (Sandbox Code Playgroud)
和:
Linux 4.18.0-15-generic #16-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
意味着 std::chrono::system_clock 在该系统上是纳秒精度(很可能是 gettimeofday 对吗?)。我有几个问题:
std::chrono::system_clock这个系统上和之间有什么区别std::chrono::steady_clock?(是的,我知道它们在标准中的指定不同,我正在考虑这个实现。)
所有 libstdc++ 目标的答案都相同吗? …
c++ ×7
c++-chrono ×3
c++11 ×2
linux ×2
32bit-64bit ×1
benchmarking ×1
c ×1
c++17 ×1
gcc ×1
linux-kernel ×1
performance ×1
time ×1
timestamp ×1
ubuntu ×1
x86 ×1