关于读入速度的小实验

发布时间 2023-09-08 10:54:23作者: NBest

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