我来填坑了。
这次我用自己写的测试读入的程序来分别测试cin(不关闭流同步),scanf和读入优化的效率差别。
 
我们分别对三个阶段的数据量n进行测试,通过时间比对来观察性能的差异。
  1. n = 102
  2. n = 104
  3. n = 105
 
为了保证测试准确并且减小偶然误差,本次测试的所有数据均为随机数。
对于每一个数据量连续测试五组不同的随机数,取平均值作为参考。
 
随机数生成器:
 #include<cstdio>
#include<ctime>
#include<cstdlib>
#define random(x) (rand()%x)
const int n = ;
int main(){
freopen("testdata.in","w",stdout);
srand((unsigned int)time());
for (int i = ;i < n;i++)
printf("%d\n",random(RAND_MAX)*random(RAND_MAX));
return ;
}

一号选手cin:

 #include<iostream>
#include<cstdio>
#include<ctime>
using namespace std;
const int n = ;
int x;
int main(){
freopen("testdata.in","r",stdin);
clock_t st,ed;
st = clock();
for (int i = ;i < n;i++)
cin >> x;
ed = clock();
printf("%fseconds",(double)(ed-st)/CLOCKS_PER_SEC);
return ;
}

二号选手scanf:

 #include<iostream>
#include<cstdio>
#include<ctime>
using namespace std;
const int n = ;
int x;
int main(){
freopen("testdata.in","r",stdin);
clock_t st,ed;
st = clock();
for (int i = ;i < n;i++)
scanf("%d",&x);
ed = clock();
printf("%fseconds",(double)(ed-st)/CLOCKS_PER_SEC);
return ;
}

三号选手读入优化:


 #include<iostream>
#include<cstdio>
#include<ctime>
using namespace std;
const int n = ;
int x;
inline int read(){
int num = ;
char c;
bool flag = false;
while ((c = getchar()) == ' ' || c == '\n' || c == '\r');
if (c == '-') flag = true;
else
num = c - '';
while (isdigit(c = getchar()))
num = num * + c - '';
return (flag ? - : ) * num;
} int main(){
freopen("testdata.in","r",stdin);
clock_t st,ed;
st = clock();
for (int i = ;i < n;i++)
x = read();
ed = clock();
printf("%fseconds",(double)(ed-st)/CLOCKS_PER_SEC);
return ;
}


进行测试。结果如下表

在n = 100的数据量下,表现的都还不错,那么n = 10^4的时候将会如何呢?

虽然这样的时间差肉眼很难分辨,但是差距还是的确存在的。

读入优化占据上风,拿到了平均0.0128s的成绩。scanf也不甘示弱,平均读入时间有0.0374s。但cin就比较惨了,只有0.0688s。

很清楚的可以看出,三种读入方式已经开始有了差别。

那么在数据量较大的10^5,三种读入方式会有怎样的表现呢?

测试发现

至此,三种读入方式的速度差异已见分晓。

scanf平均0.384s,比读入优化的0.142s慢了一些。

cin这个时候已经gg了,0.7344s,如果是单点时限1s的题,光读入就会耗掉超过七成的时间。如果算法不够优,可能就会TLE。

即使数据量很大,读入优化也是还能保证到能在很短时间内读取大量数据,所以可以说是当之无愧的“黑科技”了。

今天比较晚了,本来还想简要提一下scanf和cin 的原理并且分析速度慢的原因的,看来只能放在以后了。

明天更新夏令营Day4知识点整理。

OI常用读入方式效率测试的更多相关文章

  1. 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)

    Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...

  2. SoapUI 的几种常用参数化方式

    今天给大家来梳理下soapui这款工具关于参数化的几种方式以及具体的应用场景 1.properties 官方文档:https://www.soapui.org/docs/functional-test ...

  3. 5分钟白嫖我常用的免费效率软件/工具!效率300% up!

    Mac 免费效率软件/工具推荐 1. uTools(Windows/Mac) 还在为了翻译 English 而专门下载一个翻译软件吗? 还在为了格式某个 json 文本.时间戳转换而打开网址百度地址吗 ...

  4. NHibernate Demo 和 效率测试

    本文关于NHibernate的Demo和效率测试,希望对大家有用. 1.先去官网下载Nhibernate 2.放入到项目中并建立Helper类 private static ISession _Ses ...

  5. jQuery中ajax的4种常用请求方式

    jQuery中ajax的4种常用请求方式: 1.$.ajax()返回其创建的 XMLHttpRequest 对象. $.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数 ...

  6. iOS代码加密常用加密方式

    iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...

  7. DataGridView 中添加CheckBox和常用处理方式 .

    DataGridView 中添加CheckBox和常用处理方式 文章1 转载:http://blog.csdn.net/pinkey1987/article/details/5267934 DataG ...

  8. 关于 pgsql 数据库json几个函数用法的效率测试

    关于 pgsql 数据库json几个函数用法的效率测试 关于pgsql 几个操作符的效率测试比较1. json::->> 和 ->> 测试方法:单次运行100次,运行10个单次 ...

  9. python常用执行方式&变量&input函数

    linux系统中执行py文件方式:  ./a.py 需要执行权限 chmod -R 777(最大权限) 常用执行方式: 1. ./a.py2. python a.py 文件内部头加上 #!/usr/b ...

随机推荐

  1. 哈密顿绕行世界问题(dfs+记录路径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 哈密顿绕行世界问题 Time Limit: 3000/1000 MS (Java/Others) ...

  2. 命运(经典dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2571 命运 Time Limit: 2000/1000 MS (Java/Others)    Mem ...

  3. (a == 1 && a == 2 && a == 3),何时为true?

    今天浏览一些技术网站,看到这个题目.虽然觉着代码这么写的可能性低之又低,但是却也考验对js了解的程度. 在 JavaScript 中 (a ==1 && a== 2 && ...

  4. 将本地项目或代码上传到别人GitHub(码云)的远程分支上

    今天碰到了这样一个问题,折腾了半天,就是将自己本地代码上传到人家的远程分支上. 首先要做的就是先将人家的项目克隆到本地:git clone + 项目地址 然后进入项目目录:cd + 已克隆好的项目目录 ...

  5. Spark算子--first、count、reduce、collect、lookup

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/4b8582c8dde1529abb11e4ccc8296171.html first.count.reduce ...

  6. 月薪20k以上的高级程序员需要学习哪些技术呢?

    课程内容: 源码分析.分布式架构.微服务架构.性能优化.团队协作效率.双十一项目实战 适用对象: 1-5年或更长软件开发经验,没有工作经验但基础非常扎实,对java工作机制,常用设计思想,常用java ...

  7. [ios 开发笔记]:一句话笔记

    1.NSString转int int a=[@"123" intValue]; 同样适用于NSDictionary将NSNumber转为int   2.switch(stateme ...

  8. get最简单直接粗爆git与github教程

    Git是分布式版本控制系统(可以理解为文件管理拓展工具) github一个在线文件托管系统(可以理解为一个在线云盘) 准备工作,在git官网下载git软件件,安装git软件,以windows.为例,下 ...

  9. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  10. python 函数返回多个参数的赋值方法

    #定义函数 def Get_Counter_AllMeasureValue(self, inst_dg_address): """ get all measure val ...