博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于vector push_back()与其他方式读取数据的效率对比
阅读量:5122 次
发布时间:2019-06-13

本文共 3016 字,大约阅读时间需要 10 分钟。

引言:

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

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

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

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


生成数据代码:

#include 
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.046suser    0m1.620ssys 0m0.428s

2.resize()后再读入

real    0m1.743suser    0m1.636ssys 0m0.104s

3.scanf读入

real    0m1.885suser    0m1.776ssys 0m0.108s

4.读入优化

real    0m0.996suser    0m0.948ssys 0m0.044s

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

real    0m1.121suser    0m1.036ssys 0m0.084s

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


结论:

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


完整测试程序:

#include 
using namespace std;#define maxn 10000005vector
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

 

转载于:https://www.cnblogs.com/kongse-qi/p/6798888.html

你可能感兴趣的文章
NodeJS: 处理request网页乱码问题
查看>>
processing 根据物体移动方向改变朝向
查看>>
Centos: Screen tips
查看>>
Apache和nginx 域名配置
查看>>
VMbo下用ghost安装xp或者win7的方法 By ACReaper
查看>>
python学习笔记系列----(四)模块
查看>>
js窗口跳转方式
查看>>
Retinex图像增强算法
查看>>
11、【设计模式】构建器模式
查看>>
一:函数的基础知识
查看>>
CodeForces - 589J(DFS)
查看>>
Lua1.0 写在最初
查看>>
异常处理
查看>>
(7)、九宫格计算
查看>>
python tcp demo
查看>>
传输层和网络层区别(形象解释)
查看>>
背景图片
查看>>
计算机编码总结
查看>>
消息系统Kafka介绍
查看>>
不让数据库插入2条同样的数据
查看>>