我有一个 C 程序,在以下时间内执行以下数量的输入:
23 0.001s
100 0.001s
我尝试为此找到一个公式,但没有成功。据我所知,时间有时会翻倍,但有时却没有,这就是为什么我找不到这个公式。
有什么想法吗?
备注
1)我在CPU时间(用户+系统)中测量它。
2)我的程序使用快速排序
2)我的程序的渐近运行时分析/复杂性是O(NlogN)
答案 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;
}