看了博客:加减乘除、开根号、log等C代码实现需要多少个时钟周期 。 决定亲自试一把。
逻辑是:假定CPU一直在执行加减乘除等操作,那么让cpu循环执行N次,得到总的时间t,再cat /proc/cpuinfo得到CPU的主频大小f,根据公式t*f/N即可得到每次运算所需的时钟周期数。CPU型号为:Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
比如对于开根号:
#include <iostream>
#include <cmath>
#include <sys/time.h>
long long getCurrentTime(){//用于获取系统微秒时间
struct timeval tv;
gettimeofday(&tv,NULL);
return tv.tv_sec*1000*1000+tv.tv_usec;
}
:
int main(){
unsigned long long t_c = 2400;//1.2GHz*10^9/10^6,得到每微秒的时钟周期数
for(int k=1;k<10;k++){
unsigned long long v = pow(10,k);
long long t1 = getCurrentTime();
for(unsigned long long i=0;i<v;++i){
unsigned long long j = sqrt(i);//i+i//i-i//i*i,i*3//i/3,i/20//log(i).
}
long long t2 = getCurrentTime();
std::cout<<"time:"<<v<<"\t"<<t2-t1<<" us"<<"\tclocks:"<<t_c*(t2-t1)/v<<std::endl;
}
return 0;
}
得到的结果如下:
time:10000 199 us clocks:46
time:100000 2088 us clocks:50
time:1000000 19526 us clocks:46
time:10000000 129211 us clocks:30
time:100000000 963885 us clocks:22
time:1000000000 9642048 us clocks:22
time:10000000000 96420847 us clocks:22
从中可以看到在我的电脑上
0)开根号运算需要时钟周期数为:22;
同理得到:
1)加、减、乘、除法运算的时钟周期数为:4;
2)log运算的时钟周期数为:92。
这个结论中加减乘除运算所需时钟周期数相同,甚是奇怪,不知道是否是代码出错了,还是我的CPU对指令进行了优化。