讨论C++的cin/cout与C的scanf/printf

前言:

  在中国台湾省网友的一篇博客里注意到了这个point,在这里Mark一下给更多人看到。

  详细论证过程我就不贴了,直接上结果和简化的过程吧。

对于cin

  在Ubuntu 14.04笔电环境中对一个档案写入1e7的random整数,这裡的程式码都是简化的code。

for(int i = 0; i < (int)1e7; i++){
    printf("%d\n",rand());
}
// vs
for(int i = 0; i < (int)1e7; i++){
    cout<<rand()<<endl;
}

实验三次,printf的时间是:

1.760 s
2.677 s
1.865 s

cout:
15.921 s
15.188 s
15.685 s

优化:

  在main()函数中加上一行ios_base::sync_with_stdio(false);并将endl换成'\n'

ios_base::sync_with_stdio(false);
for(int i = 0; i < (int)1e7; i++){
    cout<<rand()<<'\n';
}

结果:
2.765 s
1.708 s
1.713 s

  去掉一些误差之后,可以看作是和printf相等。

对于cout

吃一些数字进来,然后再输出:

for(int i = 0; i < (int)1e7; i++){
    scanf("%d\n",&a);
    printf("%d\n",a+1); //output a+1;
}
// vs
for(int i = 0; i < (int)1e7; i++){
    cin>>a;
    cout<<a+1<<endl;
}

scanf/printf的时间:
2.579 s
3.994 s
3.241 s

而cin/cout:
19.970 s

优化:

  加上一行cin.tie(0);同时再包含对cin的优化。

ios_base::sync_with_stdio(false);
cin.tie(0);
for(int i = 0; i < (int)1e7; i++){
    cin>>a;
    cout<<a+1<<'\n';
}

于是有:

2.956 s
2.889 s
3.509 s

  可以说是和scanf和printf差不多了。

总结:

  在main函数里加上下面的代码并把endl换成'\n'就可以得到如上优化结果。

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

  除此之外,事实上,当把数字范围放大到1e8的时候:

scanf/printf:
30.722 s
29.428 s

cin/cout:
27.052 s
27.097 s

  可以看到,cin/cout的表现已经比scanf/printf好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值