打ACM,常数是一个比较重要的 坑点。最近有时候会遇到一些莫名其妙的TLE,或者写的时候可能就直接写错什么的,现在试验一下,一些赋值,循环语句的速度,以后注意一下。
我用的C++库函数中clock()函数测的时间,由于硬件||软件 的差异,可能有所误差,结论不正确的,欢迎大佬们留言评论。
首先两种测试方式:
1.clock_t clock();返回程序运行时刻的开始的始终周期数,至于clock_t是个什么变量,在C++库中,我找到了一句:其实是手打上的
#define CLOCKS_PER_SEC 1000
#define NULL ((void *)0)
应该就是ll了吧。。似乎跟clock有关系。。还有,天知道这是个什么玩意,反正抄上就对了
typedef __time32_t time_t;
typedef __time64_t time_t;
typedef long clock_t;
,稀里糊涂过去了,装作看懂了吧.
然后就开始测试了
我的测试格式是这样的:反正就是随便写了,又没人管,编译通过万岁!
int T=10;double ans=0;
for(int k=1;k<=T;++k){
clock_t start_time=clock();
{
//测试代码
}
clock_t end_time=clock();
double res=static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC*1000;
printf("%d:%lf\n",k,res);
ans+=res;
}printf("平均花费时间 %lf\n",ans/(T*1.0));ans=0;
然后就开始测试了。(以下表格中都用的10次的平均时间,单位ms)
首先是常见的数组||结构体初始化,
分别对int=0,-1,INF32,和ll=0,-1,INF64进行数组初始化:
我们常用的初始化有两种方式:1.memset,2.for。
我的程序(伪代码)是:
int a[1e6];
for(int i=1;i<=1e4;++i){
memset(a,key,sizeof(a));
}
我们先进行memset的初始化得到:
int | ll | |
=0 | 4901.500000 | 10024.800000 |
=-1 | 4878.900000 | 10512.700000 |
=INF | 4899.600000 | 10468.200000 |
果然是ll,就是比int长,基本就是一倍的时间,这也验证了之前听说的memset是按子节初始化的都市传说(雾。
然后是for,吧memset函数换成了1e6次的for循环:
int | ll | |
=0 | 61953.800000 | 62990.200000 |
=-1 | 62000.200000 | 63040.300000 |
=INF | 61925.600000 | 61204.000000 |
woc!由于up操作失误,ll=INF64竟然没有测完??我就从ll=INF64测出来的数据中选了一个中位数.
发现都差不多啊,果然还是memset好啊。
然后就是常见的结构体赋值了。有时候对全部赋值成int还是ll还是赋值一般??比较纠结。现在测试完之后,队友再也不用担心我写出奇怪的变量了(有科学依据,雾)。
常用的向前星,什么的结构体赋值,代码是:
struct Node{
int a,b;
ll val;
Node(int _a=0,int _b=0,ll _val=0){
a=_a;b=_b;val=_val;
}
}Edge[MAXN];
for(int i=1;i<MAXN;++i){
for(int j=1;j<MAXN;++j){
edge[j]=node(i,j,key);
}
}
还有一个是纯int的。
来比较一下:MAXN=1e4,两次循环就是1e8次赋值,应该差不多满足一般题了(还会超出哦!
iii | iil | |
=0 | 880.200000 | 770.900000 |
=-1 | 648.700000 | 729.600000 |
=INF | 873.600000 | 856.800000 |
emmmm.......这个是什么意思??难道是我的数据出了问题?
算了,不管怎么办,填0就对了!,于是MAXN=3e4...
iii | iil | |
=0 | 7837.000000 | 6912.400000 |
=-1 | 5823.200000 | 6553.200000 |
=INF | 7796.500000 | 7725.000000 |
什么嘛!有个卵子区别啊!再加!,于是MAXN=5e3...
iii | iil | |
=0 | 22114.000000 | 19264.600000 |
=-1 | 16340.500000 | 18315.800000 |
=INF | 22111.200000 | 21458.700000 |
emmm....发现了一个其他的规律。。赋值-1似乎比0要快??终于知道dalao们为什么喜欢赋值-1了,快就对了!
而且发现赋值iii要比iil慢?虽然只有一点100ms啊叫一点!!??,
所以以后决定还是分开赋值吧,毕竟节省内存,而且还快(雾。
好了,目前测试就到这里了,如果有大佬有什么好的建议,请留言评论,我会完善的。