[笔记]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 ...
随机推荐
- 【C#】组件分享:FormDragger-窗体拖拽器
适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随 ...
- POST和GET的详细解释以及区别
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...
- 【Electron】Electron开发入门
Electron简介: Electron提供了丰富的本地(操作系统)的API,使你能够使用纯JavaScript来创建桌面应用程序,并且跨平台(win,mac,linux等各种PC端平台).与其它各种 ...
- Java进阶之多线程
多线程 多线程(multiple thread)是计算机实现多任务并行处理的一种方式. 在单线程情况下,计算机中存在一个控制权,并按照顺序依次执行指令.单线程好像是一个只有一个队长指挥的小队,整个小队 ...
- 老李分享:android app自动化测试工具合集
老李分享:android app自动化测试工具合集 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...
- 老李分享:jvm内存原型剖析
老李分享:jvm内存原型剖析 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...
- koa-中间件流程控制
koa中间件执行流程 koa中间件的的执行顺序是洋葱模型,外层逐步向内,执行到最中间再逐步向外扩展,实现这个顺序的模型需要依赖于generator函数,它可以暂停执行将控制权交出,等到执行next再得 ...
- net.sz.framework 框架 登录服务器架构 单服2 万 TPS(QPS)
前言 无论我们做什么系统,95%的系统都离不开注册,登录: 而游戏更加关键,频繁登录,并发登录,导量登录:如果登录承载不起来,那么游戏做的再好,都是徒然,进不去啊: 序言 登录所需要的承载,包含程序和 ...
- Java将一个目录下的所有数据复制到另一个目录下
/* 将"C:\\JavaProducts\\Source"下的所有数据复制到"C:\\Target"下 */ import java.io.*; public ...
- 1034. Head of a Gang
One way that the police finds the head of a gang is to check people's phone calls. If there is a pho ...