引言:
在读取大量数据(数组)时,使用vector会尽量保证不会炸空间(MLE),但是相比于scanf的读取方式会慢上不少。但到底效率相差有多大,我们将通过对比测试得到结果。

测试数据:利用srand()函数生成1e7的随机数组(x[i] ∈ (0, 115000]),最终结果将是读取这1e7(一千万)的数组所消耗的时间。

测试环境:在Linux虚拟机下测试,利用编译命令:time ./t得到运行时间。

备注:在debug模式下运行,不开任何优化。


生成数据代码:

#include <bits/stdc++.h>
using namespace std; const int maxn = 10000005, lenth = 115000; int n, x, y; int main()
{
freopen("test.in", "w", stdout); cout << maxn << endl;
srand((unsigned int) time(0));
for(int i = 0; i != maxn; ++i)
{
x = rand()%lenth+1;
cout << x << endl;
} fclose(stdout);
return 0;
}

对比读入:
1.正常使用push_back()读入

for(int i = 0; i != n; ++i)
{
scanf("%d", &curr);
q1.push_back(curr);
}

2.每次空间不够时将vector数组增大空间

void test_resize(int a)
{
if(num == size_2-1)
{
q2.resize(size_2 += 10000);
}
q2[++num] = a;
return ;
} for(int i = 0; i != n; ++i)//main函数中
{
scanf("%d", &curr);
test_resize(curr);
}

3.scanf读入

for(int i = 0; i != n; ++i)//main函数中
{
scanf("%d", &x[i]);
}

4.读入优化

int read()
{
input = 0;
a = getchar();
while(a < '0' || a > '9')
a = getchar();
while(a >= '0' && a <= '9')
{
input = input*10+a-'0';
a = getchar();
}
return input;
}
for(int i = 0; i != n; ++i)
{
x[i] = read();
}

5.读入优化+resize(),再扔入vector数组

void test_resize(int a)
{
if(num == size_2-1)
{
q2.resize(size_2 += 10000);
}
q2[++num] = a;
return ;
} int read()
{
input = 0;
a = getchar();
while(a < '0' || a > '9')
a = getchar();
while(a >= '0' && a <= '9')
{
input = input*10+a-'0';
a = getchar();
}
return input;
} for(int i = 0; i != n; ++i)
{
curr = read();
test_resize(curr);
}

测试结果:
1.push_back()读入

real    0m2.046s
user 0m1.620s
sys 0m0.428s

2.resize()后再读入

real    0m1.743s
user 0m1.636s
sys 0m0.104s

3.scanf读入

real    0m1.885s
user 0m1.776s
sys 0m0.108s

4.读入优化

real    0m0.996s
user 0m0.948s
sys 0m0.044s

5.读入优化+resize,再扔入vector数组

real    0m1.121s
user 0m1.036s
sys 0m0.084s

读入优化一骑绝尘,读入优化+resize位居第二,scanf和resize大致相当,push_back()最慢。


结论:
当数据范围很大的时候,建议使用vector的resize(lenth)+读入优化的方式进行读取,这样既最大限度降低了内存的浪费,又保证了不会在读入上花费太久


完整测试程序:

#include <bits/stdc++.h>
using namespace std;
#define maxn 10000005 vector<int> q1, q2, q3;
int n, curr, num = -1, size_1, size_2;
int x[maxn], input;
char a; void test_resize(int a)
{
if(num == size_2-1)
{
q2.resize(size_2 += 10000);
}
q2[++num] = a;
return ;
} int read()
{
input = 0;
a = getchar();
while(a < '0' || a > '9')
a = getchar();
while(a >= '0' && a <= '9')
{
input = input*10+a-'0';
a = getchar();
}
return input;
} int main()
{
freopen("test.in", "r", stdin);
scanf("%d", &n);
for(int i = 0; i != n; ++i)
{
//x[i] = read();
//curr = read();
//test_resize(curr);
//scanf("%d", &x[i]);
//scanf("%d", &curr);
//test_resize(curr);
//q3.push_back(curr);
}
return 0;
}

测试自此结束。
箜瑟_qi 2017.04.07 13:55

关于vector push_back()与其他方式读取数据的效率对比的更多相关文章

  1. 关于vector push_back()与其他方式读取数据的效率对比(转)

    引言: 在读取大量数据(数组)时,使用vector会尽量保证不会炸空间(MLE),但是相比于scanf的读取方式会慢上不少.但到底效率相差有多大,我们将通过对比测试得到结果. 测试数据:利用srand ...

  2. EF 数据查询效率对比

    优化的地方: 原地址:https://www.cnblogs.com/yaopengfei/p/9226328.html ①:如果仅是查询数据,并不对数据进行增.删.改操作,查询数据的时候可以取消状态 ...

  3. Tensorflow中使用tfrecord方式读取数据-深度学习-周振洋

    本博客默认读者对神经网络与Tensorflow有一定了解,对其中的一些术语不再做具体解释.并且本博客主要以图片数据为例进行介绍,如有错误,敬请斧正. 使用Tensorflow训练神经网络时,我们可以用 ...

  4. iNeuOS工业互联平台,增加OPC UA驱动,同步和订阅方式读取数据

    目       录 1.      概述... 1 2.      平台演示... 2 3.      OPC UA应用效果... 2 1.   概述 最近的项目,用户需要使用OPC UA读取数据,通 ...

  5. Java使用JDBC连接数据库逐条插入数据、批量插入数据、以及通过SQL语句批量导入数据的效率对比

    测试用的示例java代码: package com.zifeiy.test.normal; import java.io.File; import java.io.FileOutputStream; ...

  6. 云端TensorFlow读取数据IO的高效方式

    低效的IO方式 最近通过观察PAI平台上TensoFlow用户的运行情况,发现大家在数据IO这方面还是有比较大的困惑,主要是因为很多同学没有很好的理解本地执行TensorFlow代码和分布式云端执行T ...

  7. [置顶] 云端TensorFlow读取数据IO的高效方式

    低效的IO方式 最近通过观察PAI平台上TensoFlow用户的运行情况,发现大家在数据IO这方面还是有比较大的困惑,主要是因为很多同学没有很好的理解本地执行TensorFlow代码和分布式云端执行T ...

  8. SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量

    SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量 1. ScalikeJDBC 2.配置文件 3.导入依赖的jar包 4.源码测试 通过MySQL保存kafka的偏移量 ...

  9. Oracle中读取数据一些原理研究

    文章很多摘录了 http://blog.163.com/liaoxiangui@126/blog/static/7956964020131069843572/ 同时基于这篇文章的基础上,补充一些学习要 ...

随机推荐

  1. Python中类的方法属性与方法属性的动态绑定

    最近在学习python,纯粹是自己的兴趣爱好,然而并没有系统地看python编程书籍,觉得上面描述过于繁琐,在网站找了一些学习的网站,发现廖雪峰老师的网站上面的学习资源很不错,而且言简意赅,提取了一些 ...

  2. python 发送附件至邮箱

    python 发送附件至邮箱 import smtplibfrom email.MIMEText import MIMETextfrom email.MIMEMultipart import MIME ...

  3. 一场完美的“秒杀”:API加速的业务逻辑

    清晨,我被一个客户电话惊醒,客户异常焦急,寻问CDN能不能帮助他们解决“秒杀”的问题,他们昨天刚刚进行了“整点秒杀活动”,结果并发量过大,导致服务宕机,用户投诉. 为了理清思路,我问了对方三个问题: ...

  4. 【一】Swift 3.0 新浪微博项目实战 -整体框架搭建

    最近要接手swift,所以找了个视频跟着做一下实战项目,在此记录一下过程和心得 框架搭建和目录拆分 关键词:MVVM 架构,桥接文件 桥接文件用于引入OC的头文件,Swift就可以正常使用(宏除外). ...

  5. iOS开发之数据存储之Preference(偏好设置)

    1.概述 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能. 每个应用都有个NSUserDefaults实例,通过它来存取偏好 ...

  6. 利用firefox调试安卓手机端web

    分2部分: 手机: 1.安装最新版firefox 2.打开浏览器,输入about:config 3.设置 devtools.debugger.remote-enabled 值为true devtool ...

  7. ubuntu-terminal快捷键

    常用快捷键功能:Tab 自动补全 Ctrl+a 光标移动到开始位置 Ctrl+e 光标移动到最末尾 Ctrl+k 删除此处至末尾的所有内容 Ctrl+u 删除此处至开始的所有内容 Ctrl+d 删除当 ...

  8. Android报错:WindowManager$BadTokenException: Unable to add window -- window has already been added

    很久之前测试通过的代码,现在手机升级了Android7.0后一运行就崩溃,报出这样的错误,具体错误如下: Process: com.example.sho.android_anti_theft, PI ...

  9. C++命名空间的解释 【转】

    使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突.在C++中,变量.函数和类都是大量存在的.如果没有命名空间,这些变量.函数.类的名称将都存在于全局命名空间中,会导致很多冲突.比如,如果我 ...

  10. 如何选择合适的PHP开发框架

    PHP作为一门成熟的WEB应用开发语言,已经深受广大开发者的青睐.与此同时,各式各样的PHP开发框架也从出不穷,面对如此多而且良莠不齐的开发框架,开发者们想必都会眼花缭乱,不知道该选择用哪个.其实并没 ...