问题描述
在for循环中,使用exp函数进行求幂操作,第一次耗时比后面的长很多,大概是5000-6000ns,而后面的大概在100ns左右。
问题出现的环境背景及自己尝试过哪些方法
gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
在O0和O3编译选项下,现象基本一致,第一次的计算时间远远高于后面的计算的时间。查看汇编码,并没有发现第一次计算和后面计算的汇编码有不同之处。
相关代码
// 请把代码文本粘贴到下方(请勿用图片代替代码)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<string.h>
#include<unistd.h>
double getCurrentTimestamp() {
timespec a;
clock_gettime(CLOCK_MONOTONIC, &a);
return ((double(a.tv_nsec) * 1.0e-9) + double(a.tv_sec));
}
int main(){
double a[]={0.12345,0.23456,0.22123};
for(int i=0;i<3;i++){
double start_time1 = getCurrentTimestamp();
double c = exp(a[i]);
double end_time1 = getCurrentTimestamp();
double total_time1 = (end_time1 - start_time1);
printf("total_time1 is %0.6fms\n", total_time1 * 1e3);
printf("c:%0.15f\n",c);
}
}
你期待的结果是什么?实际看到的错误信息又是什么?
这个现象出现的原因是什么呢,是计时函数的问题还是exp的问题?百思不得其解,求大神解惑。
不请自来。
应该不是计时函数的问题,可以在测试前先调用两次看看耗时。
这里可能是CPU缓存的问题,你可以多试几个函数,基本上都是第一次调用耗时较长,后面就差不多了。并且约简单的函数,这个差异越小,约复杂的函数,差异越大。