打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啊叫一点!!??,

所以以后决定还是分开赋值吧,毕竟节省内存,而且还快(雾。

好了,目前测试就到这里了,如果有大佬有什么好的建议,请留言评论,我会完善的。