cin/cout 比 scanf/printf 慢吗

之前在看书的时候,作者曾经提到过 scanf/printf 比 cin/cout 快,并建议在ACM中尽量使用 scanf/printf

当时也没怎么在意,毕竟 cin/cout 不用考虑格式占位符

但是最近几天在做 POJ 2299 一道关于求逆序对的问题

折腾了半天用树状数组做出来了发现耗时特别长,大多数AC的程序都在400ms上下

而我的程序3000+ms

一开始还在想可能是因为用树状数组需要离散化

后来又用归并排序做,也是3000+ms

和别人的程序对比了一下,几乎一样

就算是常数优化也不可能这么离谱啊

后来试着把数组读入循环中的 cin 改成 scanf

就变成400+ms了


总结了一下,这道题数组规模比较大,大约在500000左右

因此 cin 的低效率被放大了


这时候才想起来 cin/cout 和 scanf/printf 的效率问题

但是一直不知道原因


上stackflow搜了下没找到详细的解释,还是在Quora上找到的 :P


根据Quora上的解释,有三点原因:

  1. cin/cout 默认与c标准输入输出库的缓冲同步,这占据了相当多的时间。    解决方法是用 
    std::ios_base::sync_with_stdio(false);
    来关闭同步,这可以大幅提高 cin/cout 的效率
  2. 在输出换行时大多数会采用 
    cout << endl;
    而这会强制刷新缓冲区。    解决方法是用
    cout << '\n';
    来代替
  3. 在较早的GCC版本中,由于BUG,cin/cout 的效率被大大降低。    解决方法当然是使用最新版本的编译器

答主说按照上面的解决方法, cin/cout 的效率会比 scanf/printf 高大约 5%~10% 左右

但是我改了之后跑了1000+ms T T

童鞋们以后在ACM里还是尽量用 scanf/printf 吧
如果真实工程中还是 cin/cout 比较好,对于数据处理来说比较安全

嗯,就是酱

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值