std::vector与std::list效能对比(基于c++11)
测试对象类型不同,数量级不同时,表现具有差异:
测试数据对象为std::function时:
test: times(1000)
vector push_back time 469 us
vector emplace_back time 432 us
list push_back time 347 us
list emplace_back time 395 us
vector foreach time 29 us
list foreach time 24 us
test: times(10000)
vector push_back time 1459 us
vector emplace_back time 1344 us
list push_back time 816 us
list emplace_back time 885 us
vector foreach time 62 us
list foreach time 57 us
test: times(100000)
vector push_back time 11931 us
vector emplace_back time 12708 us
list push_back time 9575 us
list emplace_back time 8874 us
vector foreach time 626 us
list foreach time 711 us
test: times(1000000)
vector push_back time 110641 us
vector emplace_back time 109801 us
list push_back time 90353 us
list emplace_back time 92274 us
vector foreach time 6220 us
list foreach time 8857 us
test: times(10000000)
vector push_back time 1439122 us
vector emplace_back time 1423560 us
list push_back time 866928 us
list emplace_back time 889415 us
vector foreach time 62383 us
list foreach time 75673 us
1 #include <iostream>
2 #include <vector>
3 #include <list>
4 #include <string>
5 #include <ctime>
6 #include <functional>
7 #include <sys/time.h>
8
9 using namespace std;
10
11 class Message
12 {
13 public:
14 std::string m1;
15 std::string m2;
16 std::string m3;
17 };
18
19 int test(long times)
20 {
21 std::cout << "test: times(" << times << ")" << std::endl;
22 vector<std::function<void(int, int)>> vt, vt2;
23 list<std::function<void(int, int)>> lt, lt2;
24
25 auto msg_o = [](int, int)
26 {
27 // std::cout << 111 << std::endl;
28 return 0;
29 };
30 std::function<void(int, int)> msg = msg_o;
31
32 // ******************************* vector push_back ************************
33 timeval tv_start;
34 gettimeofday(&tv_start, NULL);
35 for (long i = 0; i < times; ++i) {
36 vt.push_back(msg);
37 }
38
39 timeval tv_end;
40 gettimeofday(&tv_end, NULL);
41 std::cout << "vector push_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
42
43 // ******************************* vector emplace_back ************************
44 gettimeofday(&tv_start, NULL);
45 for (long i = 0; i < times; ++i) {
46 vt2.emplace_back(msg);
47 }
48
49 gettimeofday(&tv_end, NULL);
50 cout << "vector emplace_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
51
52
53 // ******************************* list push_back ************************
54 gettimeofday(&tv_start, NULL);
55 for (long i = 0; i < times; ++i) {
56 lt.push_back(msg);
57 }
58
59 gettimeofday(&tv_end, NULL);
60 cout << "list push_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
61
62 // ******************************* list emplace_back ************************
63 gettimeofday(&tv_start, NULL);
64 for (long i = 0; i < times; ++i) {
65 lt2.emplace_back(msg);
66 }
67
68 gettimeofday(&tv_end, NULL);
69 cout << "list emplace_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
70 // delete msg;
71 // msg = NULL;
72 //
73
74 // ******************************* vector foreach ************************
75 gettimeofday(&tv_start, NULL);
76 for (auto& elem : vt);
77 // elem(1, 1);
78
79 gettimeofday(&tv_end, NULL);
80 cout << "vector foreach time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
81
82
83 // ******************************* list foreach ************************
84 gettimeofday(&tv_start, NULL);
85 for (auto& elem : lt);
86 // elem(1, 1);
87
88 gettimeofday(&tv_end, NULL);
89 cout << "list foreach time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
90
91 std::cout << std::endl;
92 return 0;
93 }
94
95 int main()
96 {
97 test(1000);
98 test(10000);
99 test(100000);
100 test(1000000);
101 test(10000000);
102 return 0;
103 }
测试过象为lamda函数时:
test: times(1000)
vector push_back time 662 us
vector emplace_back time 427 us
list push_back time 506 us
list emplace_back time 387 us
vector foreach time 30 us
list foreach time 23 us
test: times(10000)
vector push_back time 1762 us
vector emplace_back time 1337 us
list push_back time 1197 us
list emplace_back time 1068 us
vector foreach time 80 us
list foreach time 59 us
test: times(100000)
vector push_back time 16146 us
vector emplace_back time 14225 us
list push_back time 12449 us
list emplace_back time 10368 us
vector foreach time 682 us
list foreach time 1809 us
test: times(1000000)
vector push_back time 147707 us
vector emplace_back time 108870 us
list push_back time 125867 us
list emplace_back time 89914 us
vector foreach time 6464 us
list foreach time 9816 us
test: times(10000000)
vector push_back time 1849568 us
vector emplace_back time 1419615 us
list push_back time 1228155 us
list emplace_back time 867557 us
vector foreach time 64897 us
list foreach time 73649 us
1 #include <iostream>
2 #include <vector>
3 #include <list>
4 #include <string>
5 #include <ctime>
6 #include <functional>
7 #include <sys/time.h>
8
9 using namespace std;
10
11 class Message
12 {
13 public:
14 std::string m1;
15 std::string m2;
16 std::string m3;
17 };
18
19 int test(long times)
20 {
21 std::cout << "test: times(" << times << ")" << std::endl;
22 vector<std::function<void(int, int)>> vt, vt2;
23 list<std::function<void(int, int)>> lt, lt2;
24
25 auto msg = [](int, int)
26 {
27 // std::cout << 111 << std::endl;
28 return 0;
29 };
30 // std::function<void(int, int)> msg = msg_o;
31
32 // ******************************* vector push_back ************************
33 timeval tv_start;
34 gettimeofday(&tv_start, NULL);
35 for (long i = 0; i < times; ++i) {
36 vt.push_back(msg);
37 }
38
39 timeval tv_end;
40 gettimeofday(&tv_end, NULL);
41 std::cout << "vector push_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
42
43 // ******************************* vector emplace_back ************************
44 gettimeofday(&tv_start, NULL);
45 for (long i = 0; i < times; ++i) {
46 vt2.emplace_back(msg);
47 }
48
49 gettimeofday(&tv_end, NULL);
50 cout << "vector emplace_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
51
52
53 // ******************************* list push_back ************************
54 gettimeofday(&tv_start, NULL);
55 for (long i = 0; i < times; ++i) {
56 lt.push_back(msg);
57 }
58
59 gettimeofday(&tv_end, NULL);
60 cout << "list push_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
61
62 // ******************************* list emplace_back ************************
63 gettimeofday(&tv_start, NULL);
64 for (long i = 0; i < times; ++i) {
65 lt2.emplace_back(msg);
66 }
67
68 gettimeofday(&tv_end, NULL);
69 cout << "list emplace_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
70 // delete msg;
71 // msg = NULL;
72 //
73
74 // ******************************* vector foreach ************************
75 gettimeofday(&tv_start, NULL);
76 for (auto& elem : vt);
77 // elem(1, 1);
78
79 gettimeofday(&tv_end, NULL);
80 cout << "vector foreach time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
81
82
83 // ******************************* list foreach ************************
84 gettimeofday(&tv_start, NULL);
85 for (auto& elem : lt);
86 // elem(1, 1);
87
88 gettimeofday(&tv_end, NULL);
89 cout << "list foreach time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
90
91 std::cout << std::endl;
92 return 0;
93 }
94
95 int main()
96 {
97 test(1000);
98 test(10000);
99 test(100000);
100 test(1000000);
101 test(10000000);
102 return 0;
103 }
第三种测试,对move等的测试:
test: times(1000)
vector push_back time 292 us
vector emplace_back time 255 us
vector emplace_back time with move 400 us
list push_back time 262 us
list emplace_back time 342 us
list emplace_back time with move453 us
vector foreach time 29 us
list foreach time 25 us
test: times(10000)
vector push_back time 777 us
vector emplace_back time 843 us
vector emplace_back time with move 1105 us
list push_back time 732 us
list emplace_back time 788 us
list emplace_back time with move1055 us
vector foreach time 79 us
list foreach time 59 us
test: times(100000)
vector push_back time 9824 us
vector emplace_back time 7364 us
vector emplace_back time with move 9633 us
list push_back time 10814 us
list emplace_back time 7904 us
list emplace_back time with move10211 us
vector foreach time 689 us
list foreach time 761 us
test: times(1000000)
vector push_back time 64816 us
vector emplace_back time 70500 us
vector emplace_back time with move 95833 us
list push_back time 79398 us
list emplace_back time 81551 us
list emplace_back time with move107440 us
vector foreach time 6447 us
list foreach time 9765 us
test: times(10000000)
vector push_back time 850257 us
vector emplace_back time 858815 us
vector emplace_back time with move 1109211 us
list push_back time 760753 us
list emplace_back time 781865 us
list emplace_back time with move1030427 us
vector foreach time 67592 us
list foreach time 79275 us
1 #include <iostream>
2 #include <vector>
3 #include <list>
4 #include <string>
5 #include <ctime>
6 #include <functional>
7 #include <sys/time.h>
8
9 using namespace std;
10
11 class Message
12 {
13 public:
14 std::string m1;
15 std::string m2;
16 std::string m3;
17 };
18
19 int test(long times)
20 {
21 std::cout << "test: times(" << times << ")" << std::endl;
22 vector<std::function<void(int, int)>> vt, vt2;
23 list<std::function<void(int, int)>> lt, lt2;
24
25 auto msg_o = [](int, int)
26 {
27 // std::cout << 111 << std::endl;
28 return 0;
29 };
30 std::function<void(int, int)> *msg = new std::function<void(int, int)>[times];
31 for (long i = 0; i < times; ++i)
32 {
33 msg[times] = msg_o;
34 }
35
36 // ******************************* vector push_back ************************
37 timeval tv_start;
38 gettimeofday(&tv_start, NULL);
39 for (long i = 0; i < times; ++i) {
40 vt.push_back(msg[i]);
41 }
42
43 timeval tv_end;
44 gettimeofday(&tv_end, NULL);
45 std::cout << "vector push_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
46
47 // ******************************* vector emplace_back ************************
48 gettimeofday(&tv_start, NULL);
49 for (long i = 0; i < times; ++i) {
50 vt2.emplace_back(msg[i]);
51 }
52
53 gettimeofday(&tv_end, NULL);
54 cout << "vector emplace_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
55
56 // ******************************* vector emplace_back with move ************************
57 gettimeofday(&tv_start, NULL);
58 for (long i = 0; i < times; ++i) {
59 vt2.emplace_back(std::move(msg[i]));
60 }
61
62 gettimeofday(&tv_end, NULL);
63 cout << "vector emplace_back time with move " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
64
65
66 // ******************************* list push_back ************************
67 gettimeofday(&tv_start, NULL);
68 for (long i = 0; i < times; ++i) {
69 lt.push_back(msg[i]);
70 }
71
72 gettimeofday(&tv_end, NULL);
73 cout << "list push_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
74
75 // ******************************* list emplace_back ************************
76 gettimeofday(&tv_start, NULL);
77 for (long i = 0; i < times; ++i) {
78 lt2.emplace_back(msg[i]);
79 }
80
81 gettimeofday(&tv_end, NULL);
82 cout << "list emplace_back time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
83
84 // ******************************* list emplace_back with move ************************
85 gettimeofday(&tv_start, NULL);
86 for (long i = 0; i < times; ++i) {
87 lt2.emplace_back(std::move(msg[i]));
88 }
89
90 gettimeofday(&tv_end, NULL);
91 cout << "list emplace_back time with move" << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
92 // delete msg;
93 // msg = NULL;
94 //
95
96 // ******************************* vector foreach ************************
97 gettimeofday(&tv_start, NULL);
98 for (auto& elem : vt);
99 // elem(1, 1);
100
101 gettimeofday(&tv_end, NULL);
102 cout << "vector foreach time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
103
104
105 // ******************************* list foreach ************************
106 gettimeofday(&tv_start, NULL);
107 for (auto& elem : lt);
108 // elem(1, 1);
109
110 gettimeofday(&tv_end, NULL);
111 cout << "list foreach time " << (tv_end.tv_sec - tv_start.tv_sec) * 1000000 + tv_end.tv_usec - tv_start.tv_usec << " us" << std::endl;
112
113 std::cout << std::endl;
114 return 0;
115 }
116
117 int main()
118 {
119 test(1000);
120 test(10000);
121 test(100000);
122 test(1000000);
123 test(10000000);
124 return 0;
125 }
std::vector与std::list效能对比(基于c++11)的更多相关文章
- 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)
string.vector 互转 string 转 vector vector vcBuf;string stBuf("Hello DaMao!!!");----- ...
- 【C++11应用】基于C++11及std::thread实现的线程池
目录 基于C++11及std::thread实现的线程池 基于C++11及std::thread实现的线程池 线程池源码: #pragma once #include <functional&g ...
- 编程杂谈——std::vector与List<T>的性能比较
昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后--编程杂谈--使用emplace_back取代push_back,今日尝试在C#中测试对应功能的性能. C#中对应std:: ...
- Item 21: 比起直接使用new优先使用std::make_unique和std::make_shared
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 让我们先从std::make_unique和std::make_s ...
- 使用std::map和std::list存放数据,消耗内存比实际数据大得多
使用std::map和std::list存放数据,消耗内存比实际数据大得多 场景:项目中需要存储一个结构,如下程序段中TEST_DATA_STRU,结构占24B.但是使用代码中的std::list&l ...
- std::array,std::vector,基于范围的for循环
std::array除了有传统数组支持随机访问.效率高.存储大小固定等特点外,还支持迭代器访问.获取容量.获得原始指针等高级功能.而且它还不会退化成指针T *给开发人员造成困惑. for( 元素名变量 ...
- C++基于范围的for循环性能测试(针对std::vector)
1.代码如下: void output1(int x){ if (x == 10000000) { std::cout << x << std::endl; } }const ...
- C++ std::unordered_map使用std::string和char *作key对比
最近在给自己的服务器框架加上统计信息,其中一项就是统计创建的对象数,以及当前还存在的对象数,那么自然以对象名字作key.但写着写着,忽然纠结是用std::string还是const char *作ke ...
- std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义
std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...
随机推荐
- Spark 应用监控告警-Graphite_exporter
Spark 应用监控告警-Graphite_exporter Spark监控和工具 Web界面 事后查看 REST API 度量 高级工具 一.下载graphite_exporter 1.1 修改gr ...
- Scala安装后,在IDEA中配置
IDEA中配置Scala 一.设置Module 二.添加Scala的SDK 三.寻找本地scala安装路径 四.测试是否可以新建有Scala Class 五.踩坑填坑记录 5.1:Error:(4, ...
- linux学习之---在linux服务器上跑一段Java代码
经常在windows上进行开发,有时候,需要在Linux环境上跑一些程序测下代码,要怎么办才好嘞? 假设你对Java常用命令和linux常用命令已经基本熟悉,就可以直接按照以下步骤来啦,默认linux ...
- 给jekyll博客添加天气插件
layout: post title: 给博客添加天气插件 date: 2020-04-26 author: Dapenson header-img: img/post-bg-debug.png ca ...
- 静态链表 Static Link List
Static Link List 静态链表 其中上图来自http://www.cnblogs.com/rookiefly/p/3447982.html 参考: http://www.cnblogs. ...
- Codeforces Round #656 (Div. 3) A. Three Pairwise Maximums
题目链接:https://codeforces.com/contest/1385/problem/A 题意 给出三个正整数 $x,y,z$,找出三个正整数 $a,b,c$ 使得 $x = max(a, ...
- F - To Add Which?
Description There is an integer sequence with N integers. You can use 1 unit of cost to increase any ...
- poj2443Set Operation (bitset)
Description You are given N sets, the i-th set (represent by S(i)) have C(i) element (Here "set ...
- Pollard_rho算法进行质因素分解
Pollard_rho算法进行质因素分解要依赖于Miller_Rabbin算法判断大素数,没有学过的可以看一下,也可以当成模板来用 讲一下Pollard_rho算法思想: 求n的质因子的基本过程是,先 ...
- 1.利用consul实现k8s服务自动发现
标题 : 1.利用consul实现k8s服务自动发现 目录 : 微服务架构设计 序号 : 1 ] } } ] } } - consul自身支持ACL,但目前,Helm图表不支持其中一些功能,需要额 ...