C++11 中提供了一个计时的标准库 <chrono>
;
里面有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock;ios
在 参考连接[2] 中提供了代码,能够查看本身的机器上三种时钟的时间精度。安全
// copied from http://www.informit.com/articles/article.aspx?p=1881386&seqNum=2; // Author: Nicolai M. Josuttis #include <chrono> #include <iostream> #include <iomanip> template <typename C> void printClockData () { using namespace std; cout << "- precision: "; // if time unit is less or equal one millisecond typedef typename C::period P;// type of time unit if (ratio_less_equal<P,milli>::value) { // convert to and print as milliseconds typedef typename ratio_multiply<P,kilo>::type TT; cout << fixed << double(TT::num)/TT::den << " milliseconds" << endl; } else { // print as seconds cout << fixed << double(P::num)/P::den << " seconds" << endl; } cout << "- is_steady: " << boolalpha << C::is_steady << endl; } int main() { std::cout << "system_clock: " << std::endl; printClockData<std::chrono::system_clock>(); std::cout << "\nhigh_resolution_clock: " << std::endl; printClockData<std::chrono::high_resolution_clock>(); std::cout << "\nsteady_clock: " << std::endl; printClockData<std::chrono::steady_clock>(); #ifdef _WIN32 system("pause"); #endif return 0; }
system_clock: - precision: 0.000100 milliseconds - is_steady: false high_resolution_clock: - precision: 0.000001 milliseconds - is_steady: true steady_clock: - precision: 0.000001 milliseconds - is_steady: true
如下是 stackoverflow 上一个大佬给出的建议difference between steady clocl vs system clock网络
count()
方法time_since_epoch()
理由是:
Such emergencies arise when (for example) the committee neglects to give you all the tools you need to get the job done (such as I/O) for the
types, or such as the need to interface with some other timing API via integers 函数
在I/O 或者与其余 经过整数传参数的时间函数接口中使用。oop
例子:一个用来测试代码段运行时间的宏测试
#include <chrono> #define TIMERSTART(tag) auto tag##_start = std::chrono::steady_clock::now(),tag##_end = tag##_start #define TIMEREND(tag) tag##_end = std::chrono::steady_clock::now() #define DURATION_s(tag) printf("%s costs %d s\n",#tag,std::chrono::duration_cast<std::chrono::seconds>(tag##_end - tag##_start).count()) #define DURATION_ms(tag) printf("%s costs %d ms\n",#tag,std::chrono::duration_cast<std::chrono::milliseconds>(tag##_end - tag##_start).count()); #define DURATION_us(tag) printf("%s costs %d us\n",#tag,std::chrono::duration_cast<std::chrono::microseconds>(tag##_end - tag##_start).count()); #define DURATION_ns(tag) printf("%s costs %d ns\n",#tag,std::chrono::duration_cast<std::chrono::nanoseconds>(tag##_end - tag##_start).count()); // usage: // TIMERSTART(for_loop); // for (int i = 0; i < 100000; i++) // { // i*i; // } // TIMEREND(for_loop); // DURATION_ms(for_loop);