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 比较好,对于数据处理来说比较安全

嗯,就是酱

你可能感兴趣的:(杂碎)