计算每秒钟数

时间:2013-01-23 03:40:22

标签: c++ c++11

我做得对吗?有时,我的程序将为chrono解决方案打印2000+,它总是为CLOCKS_PER_SEC打印1000 ..

我实际在计算的是什么价值?是每秒钟数吗?

#include <iostream>
#include <chrono>
#include <thread>
#include <ctime>

std::chrono::time_point<std::chrono::high_resolution_clock> SystemTime()
{
    return std::chrono::high_resolution_clock::now();
}

std::uint32_t TimeDuration(std::chrono::time_point<std::chrono::high_resolution_clock> Time)
{
    return std::chrono::duration_cast<std::chrono::nanoseconds>(SystemTime() - Time).count();
}

int main()
{
    auto Begin = std::chrono::high_resolution_clock::now();
    std::this_thread::sleep_for(std::chrono::milliseconds(1));
    std::cout<< (TimeDuration(Begin) / 1000.0)<<std::endl;

    std::cout<<CLOCKS_PER_SEC;
    return 0;
}

2 个答案:

答案 0 :(得分:4)

为了在Linux上获得每秒正确的滴答,您需要使用::sysconf(_SC_CLK_TCK)的返回值(在标题unistd.h中声明),而不是宏CLOCKS_PER_SEC

后者是POSIX标准中定义的常量 - 它与CPU时钟的实际每秒滴答无关。例如,请参阅clock的手册页:

  

C89,C99,POSIX.1-2001。 POSIX要求CLOCKS_PER_SEC等于1000000,与实际分辨率无关。

但请注意,即使使用正确的每秒ticks常数,您仍然无法获得每秒实际CPU周期数。 “时钟滴答”是CPU时钟使用的特殊单位。没有关于它与实际CPU周期的关系的标准化定义。

答案 1 :(得分:0)

在boost的库中,有一个计时器类,使用CLOCKS_PER_SEC来计算计时器可以经过的最长时间。它说在Windows上CLOCKS_PER_SEC是1000,在Mac OS X上,Linux是1000000.所以在后一个操作系统上,准确性更高。