C++输入输出:iostream还是cstdio?
本来博客的题目是 <iostream>还是<cstdio>?结果回头一看题目变成了 还是? 气死了(╯#-_-)╯(难道<>里面的被当做注释了吗)
经常说<cstdio>里面的函数比<iostream>里面的运算符快,事实真的如此吗?本蒟蒻今天亲自测试了一下。
环境:Win7 64bit,CPU主频:2.30GHz
说明:以下程序中,主函数返回值是I/O操作花费的时间,单位:ms(可以参考clock()函数的用法 )(另外,别喷控制台背景颜色和Dev-C++qwq)
思路:用一个1~100000的for循环重复进行I/O操作,并计时,就像把一塌纸摞起来以测一张纸的厚度一样。
一、输出
1.不加优化的cout:
循环十万次,输出i,用时15585ms。
2.加优化的cout:
用时仅为6867ms,测得ios::sync_with_stdio用时0ms。
3.加优化的cerr:
cerr不加缓冲区,所以较慢:10961ms。
4.至于printf:
足足用了31秒!还是不要用了。。。原因应该是cout输出的数据类型是编译时确定的,而printf是根据%d、%c、%p、%s等在运行时确定的,要花更多的时间。不过和电脑性能可能也有关系。
5.顺便说一下,加优化的cout再用
for(register int i=1;i<=100000;++i)
(register)优化用时6772ms,快了95ms;另外,觉不要自己写递归版的输出优化...不信可以试试。
二、输入
没办法一个一个数敲,果断决定从文件输入。
文件1.txt内容如下(内容为1~100000的每个整数):
1.不加优化的cin:
只用了132ms。
2.加优化的cin:
只用了21ms!
3.scanf:
用时93ms。
4.目前市面上有一种读入优化,本蒟蒻亲自试了试:
(1)使用getchar():
①不判断负号:
只用了31ms。
②判断负号:
差别不大,30ms。
(2)使用加ios::sync_with_stdio(false)的cin.get():
用时32ms。
综上所述,输入输出都不要自己写优化了,原生的就是最好的,用了万能的
ios::sync_with_stdio(false);
后,cin、cout就可以带OIer们起飞了。(建议32位系统的julao们自己也测试一下。QAQ)
后记一:
所谓
ios::sync_with_stdio(false);
,指的是让cin、cout放飞自我,不用与stdio同步(sync,synchronize/ˈsɪŋkrənaɪz/,同步)。后果是:如果一边用cin、cout,一边用scanf、printf,就像这样:
#include<iostream> #include<cstdio> using namespace std; int main() {ios::sync_with_stdio(false);for(int i=1;i<=100000;++i)cout<<i<<' ',printf("%d\n",i);return 0; }
期望结果:
...... 99993 99993 99994 99994 99995 99995 99996 99996 99997 99997 99998 99998 99999 99999 100000 100000
但是实际结果是这样的:
各按各的套路出牌。。。完全不在一个频道上。。。(虽然都向stdout写入)
看清楚“同步”的作用了吧!所以,要抛弃stdio,就要抛地彻底,不留痕迹!qwq
后记二:
还有一个意想不到的事实!对于输出时换行这件事情,本蒟蒻又有了新的发现:
这是不换行的结果:
用时629ms;
这是用'\n'换行的结果:
用时2068ms;
这是用endl换行的结果:
就像前面提到的,用时6s多(同一个代码不同时间测试结果稍有不同)。
发现'\n'快了好多!
原因大概是endl调用了flush(冲厕所|刷新缓冲区)函数,浪费了一些时间:
所以换行不要用endl啦!
(此外,把'\n'改为"\n",稍稍慢了一点,约100ms)
后记三:
有同学说cout重定向到文件,效率会大打折扣?本蒟蒻又试了一下。
这次数据规模1e6。输出文件:1.txt。
(一)一开始文件不存在
1.cout+ios::sync_with_stdio(false)+endl:
13.65s。
2.printf:
只用了0.9112s!什么?cout跌落神坛?这究竟是人性的泯灭还是道德的沦丧?
3.别急,我说过,endl是个坑,不要故意往里跳。
cout+ios::sync_with_stdio(false)+'\n':
哈哈,printf败下阵来!0.4732s!
(二)一开始已经有1.txt文件
这种情况下花的时间要多,大概是因为要把原文件地址重新标记为可写,就像彻底删除文件,虽然只是标记为可写,但也需要一定的时间。
我们只需比较cout+'\n'和printf。
但是遇到了一些问题,由于每次结果不同,出现了有时cout快、有时printf快的情况,不过无伤大雅,因为CSP中不存在评测前就有*.out的情况。
总之,cout才是王道,又笨又慢还不安全的printf,再见啦!
要点总结:
1.用cin、cout,而不是scanf、printf;
2.用ios::sync_with_stdio(false),而不是nothing;
3.用'\n',而不是endl。
其他关于卡常的技巧可以参观:
玄学卡常
完结撒花!(觉得有帮助别忘了点个赞哦!^_^)
C++输入输出:iostream还是cstdio?相关推荐
- c语言cstdio什么意思,iostream与cstdio有什么区别?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 列个提纲: 1.cstdio是面向"文件"的,或者不强调文件和非文件流的区别,默认流就是可以关联外部文件,至于文件的外延是啥就不管,扔 ...
- 快来mark! 结构体重载运算符大全(运算、比较、赋值、输入输出)
学习紫皮书的结构体重载时,刘先生只给了加法.输出两种重载方式,成功激发了笔者的探索欲(不学懂心痒痒系列). 但当笔者网搜时,弹出的结果可真是千奇百怪.五花八门.有定义在结构体里的, 有定义在外面的, ...
- ACM的输入输出总结
关于ACM的输入输出(一) 一般来说ACM的现场赛会规定输入输出 或者是文件输入标准输出 也可能是文件输入文件输出 如果没有规定的话那么一般就是标准的输入输出了 那说一下输入输出的重定向 一般用下面两 ...
- 程序设计与算法 | (3) 输入输出与运算符、表达式
本专栏主要基于北大郭炜老师的程序设计与算法系列课程进行整理,包括课程笔记和OJ作业.该系列课程有三部分: (一) C语言程序设计:(二) 算法基础:(三) C++面向对象程序设计 (一) C语言程序设 ...
- Lawliet|C++学习笔记1——输入输出
C++学习笔记--输入输出 输出 cout输出(printf也可以) #include <iostream>//iostream-in out stream输入输出流 using name ...
- C++ 语言学习 day01 (linux ),基本输入输出错误输出函数,名字空间的含义,内联函数,缺省参数,引用 ,、new操作符
1.介绍c++ C++头文件风格 c++ 老风格:以.h结尾 是c语言风格 stdio.h (尽量不) c++的转换风格: 去掉.h 在文件名前加c 例如#include <cstdio&g ...
- c语言cstdio头文件,cstdio(cstdio头文件有什么用)
cstdio是将stdio.h的内容用c++头文件的形式表示出来.stdio.h是c标准函数库中的头文件,即:standard buffered input&output.提供基本的文字的输入 ...
- 使用C++和C语言输入输出16进制数、8进制数
使用C++输入输出16进制数.8进制数 #include <iostream> #include<cstdio> using namespace std; int main() ...
- 互联网笔试各种主流语言在OJ上的的标准输入输出
1.求a+b的和 c++ #include <iostream> using namespace std; int main() {int a,b;while(cin >> a ...
最新文章
- Spring利用JDBCTemplate实现批量插入和返回id
- docker hub 代理_MAC版 的最新Docker 2.2版本配置国内代理的解决办法
- Struts2 简介
- c# GDI+画折线图(初级版本)
- 快学Scala习题解答—第二章 控制结构和函数
- go 怎么等待所有的协程完成_怎么关闭golang协程
- TensorFlow精进之路(十):循环神经网络RNN
- Html和Css学习笔记-html进阶-html5属性
- FZU 1924——死锁——————【topo判环】
- Tor源码分析十 -- 连接和链路
- 微软 Windows 11 全套内置自带壁纸打包下载 - Win11 官方默认原生 4K 高清壁纸图片
- python绘制emoji_在Python中将emoji转换为文本
- jmail邮件服务器,asp+JMAIL实现发送邮件
- 校园网 显示ldap服务器连接不上,客户端无法连接到LDAP服务器
- ubuntu10.10 教育网 使用ipv6,亲测可用【经过再次验证与修正】
- 网易云获取带有时间轴的歌词
- IBM ServerGuide 9.21
- 算法入门——搬砖问题
- BZOJ 2095 [Poi2010]Bridges 二分 最大流(混合图欧拉回路)
- 小练笔:求最大公约数和最小公倍数