感性理解 LibreOJ 测评机速度(2017年9月及之前)

liu_cheng_ao 2017-06-26 18:41:11 2017-10-06 12:17:56

对比测试

用其它能找到编译参数,能以高内存限制运行的 OJ 对比一下就知道了。(运行时间,单位:毫秒)

# Language Loop Euler Sieve Floyd-Warshall std::set std::cin Memory Alloc (new)
LibreOJ G++ 5.4.0 (-O2) 278 262 732 680 14 460
Codeforces G++ 5.1.0 (-O2) 288 295 967 701 140 857
Universal Online Judge G++ 4.8.4 (-O2) 435 530 1377 996 30 918
BZOJ G++ 4.4.5 (-O2) 504 1280 2092 1368 Can't Input 1568
HUSTOJ 908 1460 1413 1553 17 Unexpected MLE (ML = 512MB)

结论:大致可以认为 LibreOJ C++ 跑得很快

//Test 1
#include<cstdio>

using namespace std;

int main(){
	int a=1000000000,b=1;
	while(a)b<<=1,a--;
	printf("%d\n",b);
	return 0;
}

//cf 280-296ms
//loj 268-288ms
//uoj 435-436ms
//Test 2
#include<cstdio>

using namespace std;
const int MX=50000000;
int p[MX],m[MX],pc;
int main(){
	for(int i=2;i<MX;i++){
		if(!m[i])p[++pc]=m[i]=i;
		static int k;
		for(int j=1;j<=pc&&p[j]<=m[i]&&(k=p[j]*i)<MX;j++)m[k]=p[j];
	}
	int ans=0;
	for(int i=1;i<=pc;i++)ans^=p[i];
	printf("%d\n",ans);
	return 0;
}

//cf 295-295ms
//loj 260-264ms
//uoj 487-574ms
//Test 3
#include<cstdio>

using namespace std;
const int MX=1000;
int G[MX][MX];
int sed=0;
inline int rand(){return sed=(sed*sed*73+sed*233+19260817)&0x0000ffff;}
int main(){
	for(int i=0;i<MX;i++)
		for(int j=0;j<MX;j++)
			G[i][j]=rand();
	for(int i=0;i<MX;i++)
		for(int j=0;j<MX;j++)
			for(int k=0;k<MX;k++)
				if(G[j][k]>G[j][i]+G[i][k])G[j][k]=G[j][i]+G[i][k];
	int ans=0;
	for(int i=0;i<MX;i++)
		for(int j=0;j<MX;j++)
			ans^=G[i][j];
	printf("%d\n",ans);
	return 0;
}

//cf 967-967ms
//loj 732-732ms
//uoj 1358-1397ms
//Test 4
#include<cstdio>
#include<algorithm>
#include<set>

using namespace std;

const int MX=1000000;
int sed=0;
inline int rand(){return sed=(sed*sed*73+sed*233+19260817);}
int main(){
	set<int>S;
	for(int i=0;i<MX;i++)S.insert(rand());
	int ans=0;
	for(set<int>::iterator it=S.begin();it!=S.end();it++)ans^=*it;
	printf("%d\n",ans);
	return 0;
}

//cf 701-701ms
//loj 652-708ms
//uoj 986-1007ms
//Test 5
#include<cstdio>
#include<iostream>

using namespace std;

int main(){
	int ans=0,t=0;
	for(int i=0;i<131072;i++)cin>>t,ans^=t;
	printf("%d\n",ans);
	return 0;
}
//input:131072 "1"s separated by space
//cf 140-140ms
//loj 12-16ms
//uoj 30-30ms
//Test 6
#include<cstdio>

using namespace std;
const int MX=20000000;
int *it[MX];
int main(){
	for(int i=0;i<MX;i++)it[i]=new int;
	for(int i=0;i<MX;i++)*it[i]=i;
	int ans=0;
	for(int i=0;i<MX;i++)ans^=*it[i];
	printf("%d\n",ans);
	return 0;
}
//cf 857-857ms
//loj 456-464ms
//uoj 896-940ms

读入测试

以下是若干读入整数速度测试的结果(单位:毫秒)。

输入: 10^7 个在 [0,32768) 中随机生成的整数。

# Language T1 T2 T3 T4 T5 T6 T7 T8 T9 T10 平均
fread G++ 5.4.0 (-O2) 64 68 64 68 66
getchar 328 344 336 340 344 360 356 328 320 341.2
cin (关闭同步) 616 568 552 576 564 596 588 592 572 576 580
read FPC 3.0.0 (-O2) 608 624 604 696 632 604 628 692 608 628 632.4
scanf G++ 5.4.0 (-O2) 792 796 784 800 784 852 860 836 784 796 808.4
cin 1992 1960 1980 2012 2088 1972 1976 2008 1976 2052 2001.6

共 6 条回复

negiizhao

@WAAutoMaton cin基于重载运算符,行为都是编译期决定好的,而scanf还需要解析字符串

negiizhao

有人说mmap读入比fread快,求验证

WAAutoMaton

话说为什么scanf比关闭同步的cin慢啊?

ccc000

吼啊!暴力压正解的机会到了!

liu_cheng_ao

由于找不到 luogu,Vijos,codevs,HDOJ,POJ,SPOJ 的评测配置或内存限制足够的测评方式,无法对它们进行测试。

mcfx

比香港记者跑得还快