关于在for循环中使用exp函数计时的问题

问题描述

在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的问题?百思不得其解,求大神解惑。

阅读 2.6k
1 个回答

不请自来。
应该不是计时函数的问题,可以在测试前先调用两次看看耗时。
这里可能是CPU缓存的问题,你可以多试几个函数,基本上都是第一次调用耗时较长,后面就差不多了。并且约简单的函数,这个差异越小,约复杂的函数,差异越大。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏