社区讨论
论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 条回复,欢迎继续交流。
正在加载回复...