cin cout 快速输入输出(效率优化)

iosstream很慢?

在这里,我不得不纠正大家以为iostream很慢的这样一个以讹传讹流毒无穷的错误观念。
大家观察到的iostream慢,通常都是因为C++需要保持对C的IO Library兼容,所以C++的io library是没有buffer的,而且必须一个字符一个字符来读取!
比如说有人蛋疼这么写:
getline(cin, s);
scanf("%d", &i);
这 里getline只能一个字符一个字符读取,假如它一次读了100个字符,只用到了10个,剩下的90个没办法放回stdin里面,这样下面的scanf 就是从错误的位置读取的。所以C++的library为了兼容C,不得不一个字符一个字符读取。这样就导致C++的iostream比较慢。
好在这个行为是可以设置的。cin.sync_with_stdio(false); 这样就会让C++的iostream变快了。当然你如果这么做你得保证没有用到C的io library。
下面是测试:
[xxx@yyy ~]$ cat TestCIO.c && gcc -O3 TestCIO.c -o TestCIO.out 
#include <stdio.h>

int main(int argc, char** argv)
{
  char s[1024];
  while(fgets(s,1024,stdin))
  {
    printf("%s",s);
  }
}

[xxx@yyy ~]$ cat TestCXXIO.cpp && g++ -O3 TestCXXIO.cpp -o TestCXXIO.out 
#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
  cin.sync_with_stdio(false);
  char s[1024];
  while(cin.getline(s,1024,'\n'))
    cout << s << endl;
}

[xxx@yyy ~]$ time for ((i = 0; i < 10; i++)); do ./TestCIO.out < some_text; done
...........
real    0m7.170s
user    0m0.957s
sys     0m1.623s

[xxx@yyy ~]$ time for ((i = 0; i < 10; i++)); do ./TestCXXIO.out < some_text; done
...........
real    0m7.123s
user    0m0.742s
sys     0m1.737s

两者的速度是一致的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值