社区讨论

论c++不同的读入的速度(暴力优解)

学术版参与者 10已保存回复 17

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
17 条
当前快照
1 份
快照标识符
@lo87ke5b
此快照首次捕获于
2023/10/27 14:04
2 年前
此快照最后确认于
2023/10/27 14:04
2 年前
查看原帖

博客观看更佳

众所周知,读入是一个很重要的过程(不会算法,用暴力的时候

所以选一个好的读入函数也很重要

本着实验的心态,我就把常见的cin,scanf,还有read(快读)都测了一遍(暴力的魅力

—————————————————————————————————————————————————

测试方法:

在函数的最前面先定义一个变量start,用clock函数记下当前的处理器使用时的时间,运行完了后再定义一个变量stop,clock一遍,用start-stop,就得出了运行时间(单位是毫秒)

先测cin

CPP
#include<bits/stdc++.h>
using namespace std;
int x;
int main()
{
	int start=clock();
	freopen("xxx.in","r",stdin);
	for(int i=1; i<=1000000; i++)
	{
		cin>>x;
	}
	int stop=clock();
	cout<<endl<<stop-start;
	return 0;
}
只是10^6,用了522毫秒。。。
再正常的题目中,肯定都是要运算的,这已经很危险了,暴力的话,估计只有30分。所以建议10^6的题就最好别用一般的cin了(一般的,还有不一般的,后面会说)

再来测测scanf(相信这是最大众的了)

CPP
#include<bits/stdc++.h>
using namespace std;
int x;
int main()
{
	int start=clock();
	freopen("xxx.in","r",stdin);
	for(int i=1; i<=1000000; i++)
	{
		scanf("%d",&x);
	}
	int stop=clock();
	cout<<endl<<stop-start;
	return 0;
}
用了376毫秒,已经比较安全了,但还是有隐患,如果cin暴力30分,scanf大概有45分了

但肯定会有些大佬会说“朕的快读呢?”

那我们来测一下快读

CPP
#include<bits/stdc++.h>
using namespace std;
int x;
inline int read()
{
	int x=0;
	bool flag=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
			flag=0;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return (flag?x:~(x-1));
}
int main()
{
	int start=clock();
	freopen("xxx.in","r",stdin);
	for(int i=1; i<=10000000; i++)
	{
		x=read(); 
	}
	int stop=clock();
	cout<<endl<<stop-start;
	return 0;
}
!!!只有65毫秒!!! 但是我马上发现了一个致命的问题:大长了,容易写死人

所以,进入正题,我要介绍一种更加高级的方法:

关闭同步流和绑定

code:

CPP
   ios::sync_with_stdio(false);//关闭同步流
   cin.tie(0);//取消绑定
   cout.tie(0);

别看只有三行,但是这三行可以让cin的性能提高五倍!

同步流是个什么呢?

同步流

而cin.tie(0)可以解除cin 和 cout关联,绑定时cin之前会将cout输出缓冲区的数据刷新到输出文件,解除与c输入输出stdio(scanf、printf)的联系,可以提升输入输出速率

完整代码:

CPP
#include<bits/stdc++.h>
using namespace std;
int x;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int start=clock();
	freopen("xxx.in","r",stdin);
	for(int i=1; i<=1000000; i++)
	{
		cin>>x;
	}
	int stop=clock();
	cout<<endl<<stop-start;
	return 0;
}
用了115毫秒

所以,如果想用暴力这样,但又懒得写快读,像这样,暴力拿个70,80不成问题

感谢你看我一个蒻蒻逼逼半天

~~求赞~~~~

回复

17 条回复,欢迎继续交流。

正在加载回复...