我做得对吗?有时,我的程序将为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;
}
答案 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.所以在后一个操作系统上,准确性更高。