C 程序的运行时近似公式

C 程序的运行时近似公式,c,function,time,execution,C,Function,Time,Execution,我有一个C程序,对于以下数量的输入,它在以下时间内执行: 23 0.001s 100 0.001s 我试图找到一个公式,但没有成功。就我所见,时间有时会加倍,有时不会,这就是为什么我找不到这个公式的原因 有什么想法吗 注释 1) 我用CPU时间(用户+系统)来衡量这一点 2) 我的程序使用快速排序 2) 我的程序的渐进运行时分析/复杂性是O(NlogN)绘制此图时,看起来很像是在撞上“缓存悬崖”——您的数据足够大

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

23           0.001s            
100          0.001s          
我试图找到一个公式,但没有成功。就我所见,时间有时会加倍,有时不会,这就是为什么我找不到这个公式的原因

有什么想法吗

注释

1) 我用CPU时间(用户+系统)来衡量这一点

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


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

绘制此图时,看起来很像是在撞上“缓存悬崖”——您的数据足够大,无法全部放入cpu缓存级别,因此必须在更便宜和更昂贵的级别之间交换数据

较低级别上的差异可能是由于精度造成的-如果您增加计时器块内的循环-这可能会平滑

通常,当遇到缓存悬崖时,电子性能类似于绘制O*Q

其中O是平均运行时间——在您的例子中为Nlog(N)

Q是一个阶跃函数,当传递为每个缓存分配的大小时,它会增加。 因此,Q=1低于L1尺寸,10高于L1尺寸,100高于L2尺寸,等等(仅数字为例)

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

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

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

#包括

#包括

#包括

`时钟启动TM、stopm

`#定义开始if((startm=clock())==-1){printf(“调用时钟时出错”);退出(1);}

`#如果((stopm=clock())==-1){printf(“调用时钟时出错”);退出(1);}

#定义打印时间printf(“处理器使用的%6.3f秒”),((双)stopm-
startm)/CLOCKS\u/SEC)

`int main(){

int i,x; 开始

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

}

试图确定运行速度公式取决于机器,这就是为什么对源代码进行复杂性分析更合适的原因。已经进行了复杂性分析。我正在为我的程序使用快速排序,我的复杂性是O(NlogN)NCA您能提供更多关于如何测量执行时间的详细信息吗?从开始到结束,您使用的是CPU时间还是系统时间?记住O(nlogn)只是一个测量的界限。似乎
time=0.35µs*n
能完成这项工作,对吗?如果无法确定正常公式,这个近似公式会是什么?@Danielle-这回答了你的问题吗,还是还有其他问题?
 STOP;
 PRINTTIME;