之前上传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的效率差异对比分析的更多相关文章

  1. 8-cin cout PK scanf printf(速度快慢问题对比)

    我们在c++ 中使用cin cout很方便但速度很慢,导致有些题目用cin就超时而用scanf则就ac了,那到底改用谁? cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说 ...

  2. cin/cout与scanf/printf的比较

    转自http://www.cnblogs.com/penelope/articles/2426577.html  cin .cout   基本说明: cin是标准输入流对象,代表标准输入设备(键盘), ...

  3. Oracle Spatial分区应用研究之六:全局空间索引下按县分区与按省分区效率差异原因分析

    1.实验结论 全局空间索引下,不同分区粒度之所有效率会有不同,差异并不在于SDO_FILTER操作本身,而在于对于数据字典表的访问次数上: 分区越多.表上的lob column越多,对数据字典表的访问 ...

  4. printf scanf cin cout的区别与特征

    printf和scanf是c语言的输入输出,学习c++以后,自然是用cin cout这两个更简单的输入输出 printf scanf 都需要进行格式控制,比较麻烦,但优点是速度比较快,毕竟多做了一些事 ...

  5. acdream B - 郭式树 (水题 卡cin,cout, 卡LL)

    题目 输入正好是long long的最大, 但是答案超long long 所以用unsigned, 不能用cin cout否则一定超时: 不能用abs(), abs 只用于整数. unsigned   ...

  6. scanf printf sprintf fprintf

    都是C语言中的函数,但C++保留了这些函数,在头文件iostream中声明了. 1 scanf(格式控制,输出列表) printf (格式控制,输出列表) 举例: #include <iostr ...

  7. 作业题:输出单个字符 输入单个字符 scanf printf

    输出单个字符用putchar() #include <iostream> using namespace std; int main(){ char x='B'; char y='O'; ...

  8. C++输入输出流 cin/cout 及格式化输出简介

    C++ 可通过流的概念进行程序与外界环境( 用户.文件等 )之间的交互.流是一种将数据自源( source )推送至目的地( destination )的管道.在 C++ 中,与标准输入/输出相关的流 ...

  9. 892B. Wrath#愤怒的连环杀人事件(cin/cout的加速)

    题目出处:http://codeforces.com/problemset/problem/892/B 题目大意:一队人同时举刀捅死前面一些人后还活着几个 #include<iostream&g ...

随机推荐

  1. 面向对象编程思想(前传)--你必须知道的javascript

    在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 ...

  2. Vue服务端渲染和Vue浏览器端渲染的性能对比

    Vue 2.0 开始支持服务端渲染的功能,所以本文章也是基于vue 2.0以上版本.网上对于服务端渲染的资料还是比较少,最经典的莫过于Vue作者尤雨溪大神的 vue-hacker-news.本人在公司 ...

  3. Unity利用Sapi进行windows语音开发

    软件中的语音技术主要包含两种:语音识别speech recognition和语音合成speech synthesis.一般地,开发者会因为技术实力和资金实力等各方面的问题无力完成专业的语音引擎,因此通 ...

  4. Python之路-shell&计划任务

    开发脚本自动部署及监控1.编写脚本自动部署反向代理.web.nfs:要求: I.部署nginx反向代理三个web服务,调度算法使用加权轮询:           II.所有web服务使用共享存储nfs ...

  5. 五分钟秒懂Java日志组件

    Java中有许多种日志记录方式,有些API有占位符,有些API没占位符,初学的人可能会搞不清楚这些日志组件的由来.我一开始的时候也是很懵逼的,后来一点点弄懂了于是就又了这篇文章. 在Java中进行日志 ...

  6. 全栈必备 JavaScript基础

    1995年,诞生了JavaScript语言,那一年,我刚刚从大学毕业.在今年RedMonk 推出的2017 年第一季度编程语言排行榜中,JavaScript 排第一,Java 第二,Python 反超 ...

  7. Uva 10892 LCM Cardinality (数论/暴力)

    题意:给出数n,求有多少组A,B的最小公约数为n; 思路:3000ms,直接暴力寻找,找到所有能把n整除的数 pi, 枚举所有pi 代码: #include <iostream> #inc ...

  8. 学习MVC之租房网站(二)-框架搭建及准备工作

    在上一篇<学习MVC之租房网站(一)-项目概况>中,确定了UI+Service的“双层”架构,并据此建立了项目 接下来要编写Common类库.配置AdminWeb和FrontWeb 一.编 ...

  9. Oracle数据库报错:索引中丢失 IN 或 OUT 参数

    另外,我记得好像以前也有这样的错误发生,当时的错误原因是,参数类型和数据库的类型不匹配引起的. 所以,如果有这种错误发生,应该仔细检查每个字段赋值的地方,检查类型及非空. 也可能是传参数问题,传参数过 ...

  10. Selenium1工作原理

    内容主要转自:Selenium工作原理 http://blog.csdn.net/five3/article/details/6790925 简介: Selenium 1.0中可以使用多种语言编程,当 ...