本篇文章核心意思:在编程时cin(cout)比scanf(printf)慢,在代码里加上ios::sync_with_stdio(false) 这个语句后,cin(cout)速度就会变得和scanf(printf)一样快,降低时间复杂度

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中很不错,但具体如何从没试过,因此今天就索性把能想到的所有的读数据的方式都测试了一边,结果是惊人的。

竞赛中读数据的情况最多的莫过于读一大堆整数了,于是我写了一个程序,生成一千万个随机数到data.txt中,一共55MB。然后我写了个程序主干计算运行时间,代码如下:

最简单的方法就算写一个循环scanf了,代码如下:

#include <ctime>
int main()
{  int start = clock();  //DO SOMETHING  printf("%.3lf\n",double(clock()-start)/CLOCKS_PER_SEC);
}

最简单的方法就算写一个循环scanf了,代码如下:

int numbers[MAXN];
void scanf_read()
{  freopen("data.txt","r",stdin);  for (int i=0;i<MAXN;i++)  scanf("%d",&numbers[i]);
}

可是效率如何呢?在我的电脑Linux平台上测试结果为2.01秒。接下来是cin,代码如下


const int MAXN = 10000000;  int numbers[MAXN];  void cin_read()
{ freopen("data.txt","r",stdin); for (int i=0;i<MAXN;i++)  std::cin >> numbers[i];
}

出乎我的意料,cin仅仅用了6.38秒,比我想象的要快。cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,如何禁用这个特性呢?只需一个语句std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了。程序如下:


const int MAXN = 10000000;  int numbers[MAXN];  void cin_read_nosync()
{  freopen("data.txt","r",stdin);  std::ios::sync_with_stdio(false);  for (int i=0;i<MAXN;i++)  std::cin >> numbers[i];
}

取消同步后效率究竟如何?经测试运行时间锐减到了2.05秒,与scanf效率相差无几了!有了这个以后可以放心使用cin和cout了。
接下来让我们测试一下读入整个文件再处理的方法,首先要写一个字符串转化为数组的函数,代码如下

const int MAXS = 60*1024*1024;
char buf[MAXS];  void analyse(char *buf,int len = MAXS)
{  int i;  numbers[i=0]=0;  for (char *p=buf;*p && p-buf<len;p++)  if (*p == ' ')  numbers[++i]=0;  else  numbers[i] = numbers[i] * 10 + *p - '0';
}

把整个文件读入一个字符串最常用的方法是用fread,代码如下:

const int MAXN = 10000000;
const int MAXS = 60*1024*1024;  int numbers[MAXN];
char buf[MAXS];  void fread_analyse()
{  freopen("data.txt","rb",stdin);  int len = fread(buf,1,MAXS,stdin);  buf[len] = '\0';  analyse(buf,len);
}

上述代码有着惊人的效率,经测试读取这10000000个数只用了0.29秒,效率提高了几乎10倍!掌握着种方法简直无敌了,不过,我记得fread是封装过的read,如果直接使用read,是不是更快呢?代码如下:

const int MAXN = 10000000;
const int MAXS = 60*1024*1024;  int numbers[MAXN];
char buf[MAXS];  void read_analyse()
{  int fd = open("data.txt",O_RDONLY);  int len = read(fd,buf,MAXS);  buf[len] = '\0';  analyse(buf,len);
}

END!!!!!!!!!!!!!!!!!!!!

拾趣——ios::sync_with_stdio(false)详解(提高代码运算速度)相关推荐

  1. leetcode练习——数组篇(1)(std::ios::sync_with_stdio(false);std::cin.tie(nullptr);)

    题号1. 两数之和: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复 ...

  2. 关于C++中ios::sync_with_stdio(false)

    粘贴自:https://blog.csdn.net/weixin_44015865/article/details/84974373 还是不要用了,做ZOJ-4016(URL: http://acm. ...

  3. iOS核心动画详解swift版----基础动画

    2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...

  4. iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)

    前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...

  5. std::ios::sync_with_stdio(false)的运用

    c++中cin,cout效率比较低,是因为先把要输出的东西存入缓冲区与C语言中的stdio同步后,再输出,导致效率降低,而这段语句的作用是取消缓冲区同步,直接使用,由此可节省时间,使效率与scanf与 ...

  6. ios::sync_with_stdio(false)的作用

    默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱, 所以一般会用ios::sync_with_stdio(false)来取消cin与stdin的同步,从 ...

  7. IOS 多线程04-GCD详解 底层并发 API

    IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...

  8. 关于std::ios::sync_with_stdio(false)

    std::ios::sync_with_stdio(false); 很多C++的初学者可能会被这个问题困扰,经常出现程序无故超时,最终发现问题处在cin和cout上,(甚至有些老oier也会被这个问题 ...

  9. C++ 里利用 std::ios::sync_with_stdio(false) 解决TLE问题

    2018-1-23 关于用C++里面的cin读取数据,我们都知道它的速度相对于C里面的scanf是比较慢的... 首先,我随机生成了10000000个整数 #include<stdio.h> ...

最新文章

  1. Oracle动态采样学习
  2. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)——Web网络系列学习笔记
  3. 万字图文 | 聊一聊 ReentrantLock 和 AQS 那点事(看完不会你找我)
  4. 查找乱码字符串的SQL
  5. gitlab ci 配置 java_GitLab CI/CD 配置
  6. Linux 多线程 - 线程异步与同步机制
  7. 微软全球执行副总裁沈向洋离职;马云回应双十一数据作假;GitHub 官方终于出 App 了! | 极客头条...
  8. 异常详细信息: System.ComponentModel.Win32Exception: 拒绝访问。
  9. 通俗易懂——5G调制方式全面解读
  10. 设置谷歌浏览器的flash 插件
  11. html头像生成器,Personas – 免费的卡通风格头像生成器
  12. linux秘钥登录使用authorized_keys不生效
  13. 批量添加-动态拼接字符串
  14. pat 甲级 A1008 Elevator
  15. 爬取北京二手房数据信息(python)
  16. 34. 在排序数组中查找元素的第一个和最后一个位置
  17. oracle读取数字时添加小数或者加上分隔符
  18. UnityShader17.1:ESM 阴影技术
  19. key words in TOEIC - Unit 1 Office Matters
  20. 详解微信「看一看」多模型内容策略与召回

热门文章

  1. 一文搞懂JAVA与GO垃圾回收
  2. 深入Go的底层,带你走近一群有追求的人
  3. 青蛙跳台(含变种)及汉诺塔递归,母牛生小牛
  4. LiveVideoStackCon 2022 上海站延期通告(内附最新日程海报)
  5. RT-Thread智能音箱音频应用实践
  6. 视频API的发展方向
  7. Intel视频处理与分析技术栈和架构纵览
  8. 在macOS搭建React Native for IOS开发环境
  9. 每日两SQL(10),欢迎交流~
  10. tar中的zxvf都是什么?