2023-08-29 11:13:16
有人跟我说去同步的 cin
比普通快读要快,我觉得有点邪门,所以做了一个小比较,然后果不其然又发现了奇怪的事情。
用以下代码测试:
注:输入数据 \(n=5\times 10^7,|w|\le 2^{64}-1\),由于是在学校机房老年机跑,所以测试结果可能与在其他地方测试相差较大,但是基于同一台机器的测试性能,在同一个环境跑的时间也能从某种程度上看出相对速度。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){
ll x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
return x*f;
}
ll w,n;
int main(){
freopen("test_fast_read.in","r",stdin);
int coloc1=clock();
scanf("%lld",&n);
for(int i=1;i<=n;i++)scanf("%lld",&w);
cout<<"scanf时间:"<<clock()-coloc1<<endl;
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
freopen("test_fast_read.in","r",stdin);
coloc1=clock();
cin>>n;
for(int i=1;i<=n;i++)cin>>w;
cout<<"去同步cin时间:"<<clock()-coloc1<<endl;
freopen("test_fast_read.in","r",stdin);
coloc1=clock();
n=read();
for(int i=1;i<=n;i++)w=read();
cout<<"快读时间:"<<clock()-coloc1<<endl;
}
输出:
scanf时间:55668
去同步cin时间:27656
快读时间:13613
经过多测测试,结果基本一致。
但是如果用这个代码测试:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){
ll x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
return x*f;
}
ll w,n;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
freopen("test_fast_read.in","r",stdin);
int coloc1=clock();
cin>>n;
for(int i=1;i<=n;i++)cin>>w;
cout<<"去同步cin时间:"<<clock()-coloc1<<endl;
freopen("test_fast_read.in","r",stdin);
coloc1=clock();
n=read();
for(int i=1;i<=n;i++)w=read();
cout<<"快读时间:"<<clock()-coloc1<<endl;
}
输出:
去同步cin时间:61292
快读时间:13686
好奇为什么相差这么大。(多测测试发现结果接近)
然后我就让 cin
自己跑,代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll w,n;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
freopen("test_fast_read.in","r",stdin);
int coloc1=clock();
cin>>n;
for(int i=1;i<=n;i++)cin>>w;
cout<<"去同步cin时间:"<<clock()-coloc1<<endl;
}
输出结果仍然为:
去同步cin时间:60591
要不输出出来看看?
与输入文件完全一致!!!!
什么情况,加了个 scanf
就给它加速了???
离谱,不理解,我甚至人工计时,发现结果是一样的,为什么又有这么邪门的事情发生。
希望有大佬解答。
end writing 2023.8.29 11:12