相关疑难解决方法(0)

CLOCK_REALTIME和CLOCK_MONOTONIC之间的区别?

你能解释一下Linux上返回的时钟CLOCK_REALTIMECLOCK_MONOTONIC时钟之间的区别clock_gettime()吗?

如果我需要计算外部源产生的时间戳与当前时间之间的经过时间,那么哪个是更好的选择?

最后,如果我有一个NTP守护进程周期性地调整系统时间,如何做这些调整与每个交互CLOCK_REALTIMECLOCK_MONOTONIC

linux

185
推荐指数
6
解决办法
16万
查看次数

在Linux中测量时间 - 时间与时钟对比getrusage vs clock_gettime vs gettimeofday vs timespec_get?

其中计时功能,time,clock getrusage,clock_gettime,gettimeofdaytimespec_get,我想清楚地了解它们是如何实现的,为了知道在什么情况下我必须使用他们什么是他们的返回值.

首先,我们需要对返回wall-clock值的函数进行分类,与返回进程或线程值的函数进行比较.gettimeofday返回wall-clock值,clock_gettime返回wall-clock值进程或线程值,具体取决于Clock传递给它的参数.getrusageclock返回过程值.

然后第二个问题涉及这些功能的实施,因此,它们的准确性.这些功能使用哪种硬件或软件机制.

似乎getrusage只使用内核tick(通常为1ms长),因此不能比ms更准确.这样对吗?然后该getimeofday函数似乎使用最准确的底层硬件.因此,它的准确性通常是近期硬件上的微秒(因为API而不能更多).那么clock,手册页谈的是"近似",它是什么意思?那么clock_gettime,API是纳秒级,是否意味着如果底层硬件允许它,它能够如此准确?单调性怎么样?

还有其他功能吗?

c linux time linux-kernel

137
推荐指数
2
解决办法
6万
查看次数

std :: chrono :: high_resolution_clock的分辨率与测量值不对应

让我通过这个测试程序问我的问题:

#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需要多少纳秒? …

c++ c++11 c++-chrono visual-studio-2012

30
推荐指数
2
解决办法
2万
查看次数

steady_clock和system_clock之间的区别?

我试图通过查看数据的时间戳来查看我的数据是否是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框上运行此代码.

c++ timestamp c++11

19
推荐指数
2
解决办法
1万
查看次数

在Windows上,试用版代码的运行速度比32位快32倍,而在Linux上则高于64位

我有一段代码,在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)

c++ performance benchmarking x86 32bit-64bit

12
推荐指数
2
解决办法
931
查看次数

chrono steady_clock没有给出正确的结果?

我的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)

你看到差异吧?我很困惑为什么这是差异,我无法理解这一点?所有代码和一切都是一样的.有没有人对此有任何解释,我该如何解决?

如果需要,我可以尝试添加一些调试代码,看看弄清楚这个问题有什么不对.

c++ ubuntu gcc c++-chrono

7
推荐指数
1
解决办法
1804
查看次数

c ++获得独立于平台的经过时间

对于游戏,我想测量自上一帧以来经过的时间。

我曾经glutGet(GLUT_ELAPSED_TIME)这样做过。但是在包含 glew 之后,编译器再也找不到 glutGet 函数了(奇怪)。所以我需要一个替代方案。

到目前为止,我发现的大多数网站都建议在 ctime 中使用时钟,但该功能仅测量程序的 CPU 时间,而不是实时时间!ctime 中的时间函数只精确到秒。我需要至少毫秒精度。

我可以使用 C++11。

c++ cross-platform

4
推荐指数
1
解决办法
3160
查看次数

程序执行时间计数器

在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)

谢谢

c++

2
推荐指数
1
解决办法
3422
查看次数

C++ 实现中 std::chrono::system_clock 与 std::chrono::steady_clock 的精度?

以下程序:

#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 对吗?)。我有几个问题:

  1. std::chrono::system_clock这个系统上和之间有什么区别std::chrono::steady_clock?(是的,我知道它们在标准中的指定不同,我正在考虑这个实现。)

  2. 所有 libstdc++ 目标的答案都相同吗? …

c++ c++-chrono c++17

2
推荐指数
1
解决办法
4554
查看次数