如何实现纳秒级计时

摘要

在一些benchmark或者应用程序中经常使用计时函数来对整个程序或代码的部分进行计时,但是往往存在一个问题就是计时精度不够高,因为往往使用的计时函数gettimeofday或者一些低精度计时函数,它们的计时精度往往都是微妙us,但是如果一段代码的执行时间就是1us上下,那么计时将会不太准确,所以需要精确到用了多少个CPU时钟周期的计时函数,不过这个有一个前提,那就是需要CPU锁频,不然会导致计时不准

参考

http://blog.chinaunix.net/uid-8048969-id-4877850.html

代码

#include <cstdio>
#include <unistd.h> // for sleep func

long long int CPU_FREQUENCY=2700000000;
long long int startCycle, stopCycle;

inline long long int getCurrentCycle() {
	unsigned low, high;
	__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high));
	return ((unsigned long long)low) | (((unsigned long long)high)<<32);
}

inline void timerStart() {
	startCycle = getCurrentCycle();
}

inline void timerStop() {
	stopCycle = getCurrentCycle();
}

inline double timeCalculate(long long int startCycle = startCycle, long long int stopCycle = stopCycle) {
	return (double)(stopCycle-startCycle)/CPU_FREQUENCY;
}

int main() {
	long long int start, end;
	unsigned low, high;
	timerStart();
	sleep(10);
	timerStop();
	double time = timeCalculate();
	printf("Speed %lf time\n", time);
	return 0;
}

这个调用CPU周期的函数并不需要任何的头文件

测试

$ icc test.cpp -o test && ./test
Speed 9.976559 time

有一定误差,差不多是0.33%