测试运算所需时钟周期数

看了博客:加减乘除、开根号、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对指令进行了优化。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值