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