[笔记]cin、cout与scanf、printf的效率差异对比分析
之前上传UVa227 puzzle时,好不容易AC了,但发现自己用时50(ms),而在VJ上看到人家都是40ms、20ms,于是打开一个20ms的代码查看人家强在哪里。但结果研究了半天感觉差不多,于是想着应该不是算法的问题。然后又想到,网上提交的答案,大家都是用scanf和printf写的,而我用的cin cout,而这题的确需要大量的输入输出,于是就想着把所有cin cout改成scanf printf。结果 —。—
上面c++版,下面c版。
于是我很好奇C的输入输出方法和C++提倡的方法为什么差距那么大。经过一番研究和查询,结果如下:
首先是scanf和cin:
cin之所以慢,主要是因为要与scanf同步的关系,即允许scanf与cin混用。但是如果你的代码里没用到scanf,那么想关闭同步也可以。
只要使用这行代码,就可关闭同步:std::ios::sync_with_stdio(false);
关闭同步后的cin效率大大提高。有人说比scanf还高,有人说差不多,网上评论不一。其实cin关闭同步后真正的效率如何还是依赖编译器。下面这篇博文很详尽地比较了cin和关闭同步的cin和scanf:https://www.byvoid.com/blog/fast-readfile 。看完这篇基本就可以了解性能上的差异了,编译器占的因素蛮大的。那么关了同步的cin与scanf差不多,但是cin是新标准,更安全更便捷。况且string只能用cin。
然后是printf和cout:
对于cout和printf,则效率差异不明显。有人认为流更快有人认为printf快,逛论坛查询时看到他们都吵起来了。具体怎样我又找到一篇博文:http://www.cnblogs.com/killerlegend/p/3918452.html 。他的结论是:输出时尽量使用cout,输入时尽量使用scanf。不过我也测试了,试了点最简单的:
int main()
{
clock_t a, b;
a = clock();
for (int i = 0;i < 29999;++i)
cout << i << '\n';
b = clock();
cout << b - a;
return 0;
}
与
int main()
{
clock_t a, b;
a = clock();
for (int i = 0;i < 29999;++i)
printf("%d\n",i);
b = clock();
printf("%d",b - a);
return 0;
}
结果是:cout用时6124,printf用时3536。cout比printf差了一倍不到。而且对于cout,那句“std::ios::sync_with_stdio(false);”其实是不起作用的,它只针对cin。于是我的结论与上面链接里的博文相反。
所以cout和printf效率可以说差不多,主要还是看编译器吧。使用时也不必纠结,只是cout毕竟新标准,更安全适用面更广更灵活。
最后:
本文讨论的输入输出使用仅仅针对ACM做题。scanf的确快,拿来做题还是很不错的。输入量少的话拿cin也毫无问题,刷个题目也没必要特地跑过去关闭同步。而且cin更安全更便捷,还支持重载。且对于string与自定义的数据,就只能用cin、cout没跑了。
对于我们这种有强迫症、选择恐惧症的,有两个方法给你自由选择也未必是个好事。不分分清楚心理难受哈哈。
[笔记]cin、cout与scanf、printf的效率差异对比分析的更多相关文章
- 8-cin cout PK scanf printf(速度快慢问题对比)
我们在c++ 中使用cin cout很方便但速度很慢,导致有些题目用cin就超时而用scanf则就ac了,那到底改用谁? cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说 ...
- cin/cout与scanf/printf的比较
转自http://www.cnblogs.com/penelope/articles/2426577.html cin .cout 基本说明: cin是标准输入流对象,代表标准输入设备(键盘), ...
- Oracle Spatial分区应用研究之六:全局空间索引下按县分区与按省分区效率差异原因分析
1.实验结论 全局空间索引下,不同分区粒度之所有效率会有不同,差异并不在于SDO_FILTER操作本身,而在于对于数据字典表的访问次数上: 分区越多.表上的lob column越多,对数据字典表的访问 ...
- printf scanf cin cout的区别与特征
printf和scanf是c语言的输入输出,学习c++以后,自然是用cin cout这两个更简单的输入输出 printf scanf 都需要进行格式控制,比较麻烦,但优点是速度比较快,毕竟多做了一些事 ...
- acdream B - 郭式树 (水题 卡cin,cout, 卡LL)
题目 输入正好是long long的最大, 但是答案超long long 所以用unsigned, 不能用cin cout否则一定超时: 不能用abs(), abs 只用于整数. unsigned ...
- scanf printf sprintf fprintf
都是C语言中的函数,但C++保留了这些函数,在头文件iostream中声明了. 1 scanf(格式控制,输出列表) printf (格式控制,输出列表) 举例: #include <iostr ...
- 作业题:输出单个字符 输入单个字符 scanf printf
输出单个字符用putchar() #include <iostream> using namespace std; int main(){ char x='B'; char y='O'; ...
- C++输入输出流 cin/cout 及格式化输出简介
C++ 可通过流的概念进行程序与外界环境( 用户.文件等 )之间的交互.流是一种将数据自源( source )推送至目的地( destination )的管道.在 C++ 中,与标准输入/输出相关的流 ...
- 892B. Wrath#愤怒的连环杀人事件(cin/cout的加速)
题目出处:http://codeforces.com/problemset/problem/892/B 题目大意:一队人同时举刀捅死前面一些人后还活着几个 #include<iostream&g ...
随机推荐
- dispaly属性,position属性
position:absolute;绝对定位相对于父元素(父元素设为relative) position:relative;相对定位相对于自己 position:fixed;固定定位相对于浏览器 di ...
- 使用nginx代理kibana并设置身份验证
1.在es-sever上安装nginx #wget http://nginx.org/download/nginx-1.8.1.tar.gz #tar xvf nginx-1.8.1.tar.gz # ...
- 查找及修改日程管理系统中的bug
1.Java没有分包都糅合在一起 2.在登录界面,没有输入账号密码,点击登录按钮时程序会崩溃,需要给给用户名和密码添加Toast (注:由于程序没有运行出来,所以是搭档孙刘兰的截图) 3.Regist ...
- poptest老李谈jvm的GC
poptest老李谈jvm的GC poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:90882 ...
- 手机自动化测试:appium源码分析之bootstrap七
手机自动化测试:appium源码分析之bootstrap七 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.poptest测试 ...
- 老李分享:《Linux Shell脚本攻略》 要点(七)
老李分享:<Linux Shell脚本攻略> 要点(七) 1.显示给定文件夹下的文件的磁盘适用情况 [root@localhost program_test]# du -a -h ./ ...
- GitLab 客户端添加SSH KEY
一.生成公钥 先查看系统用户目录下是否有 .ssh 文件夹,如果有的话,那说明你之前已经生成过公钥,则可以跳过生成公钥. 运行下面的命令生成一个密钥: ssh-keygen -t rsa -C &qu ...
- UILabel的讲解
首先,我先自定义几个名词,方便接下来的讲解工作.如下图所示: 接下来,通过五个方面来讲解我们能对UILabel做出哪些改变或者称之为设置: 1.文字 1.1普通文字:内容text.字体大小font.字 ...
- 震荡信号Simulink仿真
1. simulink仿真设计 震荡信号本质是调制信号,可以表示为: u(t)=A*(1+m*cos(Ωt+θ))*cos(ωt+φ)=A*cos (ωt+φ)+ A*m*cos(Ωt+θ)*cos( ...
- 设计模式的征途—3.工厂方法(Factory Method)模式
上一篇的简单工厂模式虽然简单,但是存在一个很严重的问题:当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背开闭原则.如何实现新增新产品而 ...