程序的运行时近似公式

时间:2013-11-14 20:21:16

标签: c function time execution

我有一个 C 程序,在以下时间内执行以下数量的输入:

23           0.001s            
100          0.001s          

我尝试为此找到一个公式,但没有成功。据我所知,时间有时会翻倍,但有时却没有,这就是为什么我找不到这个公式。

有什么想法吗?

备注

1)我在CPU时间(用户+系统)中测量它。

2)我的程序使用快速排序

2)我的程序的渐近运行时分析/复杂性是O(NlogN)

2 个答案:

答案 0 :(得分:2)

绘制它看起来非常像你正在遇到“缓存悬崖” - 你的数据足够大,所以它不能全部适合cpu缓存级别,所以必须在更便宜和更昂贵的级别之间交换数据

较低级别的差异可能是由于准确性 - 如果你增加计时器块内的循环 - 这可能会平滑

通常在遇到缓存悬崖时,电子表格就像绘制O * Q

其中O是平均运行时间 - 您的案例中的Nlog(N)

和Q是一个步进函数,随着为每个缓存传递分配的大小而增加。 所以Q = 1低于L1大小,10高于L1大小,100高于L2大小等(仅限数字)

事实上,有些人通过绘制O(1)函数并查找悬崖表演悬崖上使用的内存来验证其缓存大小:

           ___
 _____-----
  L1 | L2 | L3

答案 1 :(得分:0)

我总是使用它来获得精确的运行时间..

#include<stdio.h>

#include <time.h>

#include <stdlib.h>

`clock_t startm,stopm;

`#define START if((startm = clock())== -1){printf(“Error calling clock”); exit(1);}

`#define STOP if((stopm = clock())== -1){printf(“Error calling clock”); exit(1);}

#define PRINTTIME printf( "%6.3f seconds used by the processor.", ((double)stopm- startm)/ CLOCKS_PER_SEC);

`int main(){

int i,x;      START;

  scanf("%d",&x);
 for(i=0;i<10000;i++){
printf("%d\n",i);

}

 STOP;
 PRINTTIME;

}