关于vector push_back()与其他方式读取数据的效率对比(转)
引言:
在读取大量数据(数组)时,使用vector会尽量保证不会炸空间(MLE),但是相比于scanf的读取方式会慢上不少。但到底效率相差有多大,我们将通过对比测试得到结果。
测试数据:利用srand()函数生成1e7的随机数组(x[i] ∈ (0, 115000]),最终结果将是读取这1e7(一千万)的数组所消耗的时间。
测试环境:在Linux虚拟机下测试,利用编译命令:time ./t得到运行时间。
备注:在debug模式下运行,不开任何优化。
生成数据代码:
#include <bits/stdc++.h>
using namespace std; const int maxn = , lenth = ; int n, x, y; int main()
{
freopen("test.in", "w", stdout); cout << maxn << endl;
srand((unsigned int) time());
for(int i = ; i != maxn; ++i)
{
x = rand()%lenth+;
cout << x << endl;
} fclose(stdout);
return ;
}
对比读入:
1.正常使用push_back()读入
for(int i = ; i != n; ++i)
{
scanf("%d", &curr);
q1.push_back(curr);
}
2.每次空间不够时将vector数组增大空间
void test_resize(int a)
{
if(num == size_2-)
{
q2.resize(size_2 += );
}
q2[++num] = a;
return ;
} for(int i = ; i != n; ++i)//main函数中
{
scanf("%d", &curr);
test_resize(curr);
}
3.scanf读入
for(int i = ; i != n; ++i)//main函数中
{
scanf("%d", &x[i]);
}
4.读入优化
int read()
{
input = ;
a = getchar();
while(a < '' || a > '')
a = getchar();
while(a >= '' && a <= '')
{
input = input*+a-'';
a = getchar();
}
return input;
}
for(int i = ; i != n; ++i)
{
x[i] = read();
}
5.读入优化+resize(),再扔入vector数组
void test_resize(int a)
{
if(num == size_2-)
{
q2.resize(size_2 += );
}
q2[++num] = a;
return ;
} int read()
{
input = ;
a = getchar();
while(a < '' || a > '')
a = getchar();
while(a >= '' && a <= '')
{
input = input*+a-'';
a = getchar();
}
return input;
} for(int i = ; 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 = -, size_1, size_2;
int x[maxn], input;
char a; void test_resize(int a)
{
if(num == size_2-)
{
q2.resize(size_2 += );
}
q2[++num] = a;
return ;
} int read()
{
input = ;
a = getchar();
while(a < '' || a > '')
a = getchar();
while(a >= '' && a <= '')
{
input = input*+a-'';
a = getchar();
}
return input;
} int main()
{
freopen("test.in", "r", stdin);
scanf("%d", &n);
for(int i = ; 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 ;
}
转自:http://blog.csdn.net/kongse_qi/article/details/69526418
关于vector push_back()与其他方式读取数据的效率对比(转)的更多相关文章
- 关于vector push_back()与其他方式读取数据的效率对比
引言: 在读取大量数据(数组)时,使用vector会尽量保证不会炸空间(MLE),但是相比于scanf的读取方式会慢上不少.但到底效率相差有多大,我们将通过对比测试得到结果. 测试数据:利用srand ...
- EF 数据查询效率对比
优化的地方: 原地址:https://www.cnblogs.com/yaopengfei/p/9226328.html ①:如果仅是查询数据,并不对数据进行增.删.改操作,查询数据的时候可以取消状态 ...
- Tensorflow中使用tfrecord方式读取数据-深度学习-周振洋
本博客默认读者对神经网络与Tensorflow有一定了解,对其中的一些术语不再做具体解释.并且本博客主要以图片数据为例进行介绍,如有错误,敬请斧正. 使用Tensorflow训练神经网络时,我们可以用 ...
- iNeuOS工业互联平台,增加OPC UA驱动,同步和订阅方式读取数据
目 录 1. 概述... 1 2. 平台演示... 2 3. OPC UA应用效果... 2 1. 概述 最近的项目,用户需要使用OPC UA读取数据,通 ...
- Java使用JDBC连接数据库逐条插入数据、批量插入数据、以及通过SQL语句批量导入数据的效率对比
测试用的示例java代码: package com.zifeiy.test.normal; import java.io.File; import java.io.FileOutputStream; ...
- 云端TensorFlow读取数据IO的高效方式
低效的IO方式 最近通过观察PAI平台上TensoFlow用户的运行情况,发现大家在数据IO这方面还是有比较大的困惑,主要是因为很多同学没有很好的理解本地执行TensorFlow代码和分布式云端执行T ...
- [置顶]
云端TensorFlow读取数据IO的高效方式
低效的IO方式 最近通过观察PAI平台上TensoFlow用户的运行情况,发现大家在数据IO这方面还是有比较大的困惑,主要是因为很多同学没有很好的理解本地执行TensorFlow代码和分布式云端执行T ...
- SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量
SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量 1. ScalikeJDBC 2.配置文件 3.导入依赖的jar包 4.源码测试 通过MySQL保存kafka的偏移量 ...
- Oracle中读取数据一些原理研究
文章很多摘录了 http://blog.163.com/liaoxiangui@126/blog/static/7956964020131069843572/ 同时基于这篇文章的基础上,补充一些学习要 ...
随机推荐
- Linux命令之locate
locate [选项] [pattern] 在mlocate数据库中搜索条目.配合数据库缓存快速查看文件相关位置. locate命令和find -name功能差不多,但是比find搜索要快.因为fin ...
- Xamarin XAML语言教程模板视图TemplatedView(二)
Xamarin XAML语言教程模板视图TemplatedView(二) (2)打开MainPage.xaml文件,编写代码,将构建的控件模板应用于中TemplatedView.代码如下: <? ...
- Xamarin中VS无法连接Mac系统的解决办法
Xamarin中VS无法连接Mac系统的解决办法 按照以下步骤排查:(1)确认Mac系统中安装Xamarin.iOS开发必备的组件,如Mono.Xamarin.iOS.(2)将Windows和Mac下 ...
- VB查询数据库之终极篇——机房收费系统总结(七)
机房收费系统总结系列到此就算是要结束了.在做机房收费系统之前,做了学生管理系统,可以说,对机房收费系统的帮助很大. 在机房收费系统中,数据库的查询,数据写入数据库,更改数据库内的信息等一些操作在学生信 ...
- POJ2505 A multiplication game 博弈论 找规律
http://poj.org/problem?id=2505 感觉博弈论只有找规律的印象已经在我心中埋下了种子... 题目大意:两个人轮流玩游戏,Stan先手,数字 p从1开始,Stan乘以一个2-9 ...
- JZYZOJ1537 [haoi2014]贴海报
http://172.20.6.3/Problem_Show.asp?id=1537 用的方法叫作浮水法,实质是递归自下而上判断一个区间有没有覆盖,O(n^2)感觉也没有很实用. 前几年的haoi怎么 ...
- 雅礼集训DAY 6 T1 xmasdag
感谢gryz的mly大好人再次给我提供了题目和数据. 和昨晚那个题几乎一样,都是x^n最后转化成第二类斯特林数*阶乘*Σ(和路径长度有关的组合数),而因为组合数是可以利用Pascal公式实现O(1)递 ...
- BZOJ 3239 Discrete Logging(BSGS)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3239 [题目大意] 计算满足 Y^x ≡ Z ( mod P) 的最小非负整数 [题解 ...
- Django contenttypes 框架详解
一.什么是Django ContentTypes? Django ContentTypes是由Django框架提供的一个核心功能,它对当前项目中所有基于Django驱动的model提供了更高层次的抽象 ...
- Deep TEN: Texture Encoding Network
纹理特征,材料分类(Material Classification),在MINC-2500.Flickr Material Database.KTH-TIPS-2b.4D-Light-Field-Ma ...