拾趣——ios::sync_with_stdio(false)详解(提高代码运算速度)
本篇文章核心意思:在编程时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)详解(提高代码运算速度)相关推荐
- leetcode练习——数组篇(1)(std::ios::sync_with_stdio(false);std::cin.tie(nullptr);)
题号1. 两数之和: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复 ...
- 关于C++中ios::sync_with_stdio(false)
粘贴自:https://blog.csdn.net/weixin_44015865/article/details/84974373 还是不要用了,做ZOJ-4016(URL: http://acm. ...
- iOS核心动画详解swift版----基础动画
2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...
- iOS 2D绘图详解(Quartz 2D)之路径(点,直线,虚线,曲线,圆弧,椭圆,矩形)
前言:一个路径可以包含由一个或者多个shape以及子路径subpath,quartz提供了很多方便的shape可以直接调用.例如:point,line,Arc(圆弧),Curves(曲线),Ellip ...
- std::ios::sync_with_stdio(false)的运用
c++中cin,cout效率比较低,是因为先把要输出的东西存入缓冲区与C语言中的stdio同步后,再输出,导致效率降低,而这段语句的作用是取消缓冲区同步,直接使用,由此可节省时间,使效率与scanf与 ...
- ios::sync_with_stdio(false)的作用
默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱, 所以一般会用ios::sync_with_stdio(false)来取消cin与stdin的同步,从 ...
- IOS 多线程04-GCD详解 底层并发 API
IOS 多线程04-GCD详解 底层并发 API 注:本人是翻译过来,并且加上本人的一点见解. 前言 想要揭示出表面之下深层次的一些可利用的方面.这些底层的 API 提供了大量的灵活性,随之而来的是大 ...
- 关于std::ios::sync_with_stdio(false)
std::ios::sync_with_stdio(false); 很多C++的初学者可能会被这个问题困扰,经常出现程序无故超时,最终发现问题处在cin和cout上,(甚至有些老oier也会被这个问题 ...
- C++ 里利用 std::ios::sync_with_stdio(false) 解决TLE问题
2018-1-23 关于用C++里面的cin读取数据,我们都知道它的速度相对于C里面的scanf是比较慢的... 首先,我随机生成了10000000个整数 #include<stdio.h> ...
最新文章
- Oracle动态采样学习
- 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)——Web网络系列学习笔记
- 万字图文 | 聊一聊 ReentrantLock 和 AQS 那点事(看完不会你找我)
- 查找乱码字符串的SQL
- gitlab ci 配置 java_GitLab CI/CD 配置
- Linux 多线程 - 线程异步与同步机制
- 微软全球执行副总裁沈向洋离职;马云回应双十一数据作假;GitHub 官方终于出 App 了! | 极客头条...
- 异常详细信息: System.ComponentModel.Win32Exception: 拒绝访问。
- 通俗易懂——5G调制方式全面解读
- 设置谷歌浏览器的flash 插件
- html头像生成器,Personas – 免费的卡通风格头像生成器
- linux秘钥登录使用authorized_keys不生效
- 批量添加-动态拼接字符串
- pat 甲级 A1008 Elevator
- 爬取北京二手房数据信息(python)
- 34. 在排序数组中查找元素的第一个和最后一个位置
- oracle读取数字时添加小数或者加上分隔符
- UnityShader17.1:ESM 阴影技术
- key words in TOEIC - Unit 1 Office Matters
- 详解微信「看一看」多模型内容策略与召回