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 ...
随机推荐
- Web漏洞扫描-Burp Suite
Web漏洞扫描-Burp Suite 一.Burp Suite概述 二.功能及特点 三.Burp Suite安装 四.Burp Suite使用 一.Burp Suite概述 安全渗透界使用最广泛的漏扫 ...
- cassandra权威指南读书笔记--安全
认证和授权driver,JMX和cassandra服务器支持SSL/TLS,cassandra节点间也支持SSL/TLS.密码认证器cassandra还支持自定义,可插拔的认证机制.默认的认证器:or ...
- TcaplusDB常见问题-数据库原理类
gameserver 如何剔除某个无效的 tcaproxy(接入层)节点? TcaplusDB API 在这里对 tcaproxy 异常做了容灾的处理,API 剔除无效的 tcaproxy 进程的方式 ...
- 使用kubekey安装kubesphere
下载 KubeKey KubeKey 是新一代 Kubernetes 和 KubeSphere 安装器,可帮助您以简单.快速.灵活的方式安装 Kubernetes 和 KubeSphere. expo ...
- @AliasFor 注解
Spring 框架提供了很丰富的注解可以让我们很方便的进行 Spring 配置,今天要讲的注解--@AliasFor之前你可能并没有关注过,因为平时开发时我们的确不太会用到. 我关注到这个注解是因为我 ...
- B - Power Strings
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...
- CF 1326 D. Prefix-Suffix Palindrome
D. Prefix-Suffix Palindrome 题意 给一个字符串 s,求一个字符串 t,t 由 s 的某个前缀以及某个后缀拼接而成,且 t 是回文串,长度不能超过 s.输出最长的 t 分析 ...
- Educational Codeforces Round 83 D. Count the Arrays(组合,逆元,快速幂)
题意: 从 m 个数中选 n - 1 个数组成先增后减的长为 n 的数组. 思路: 因为 n 个数中有两个数相同,所以每种情况实际上只有 n - 1 个不同的数--$c_m^{n - 1}$, 除去最 ...
- NOIP2015提高组 信息传递 ---并查集问题
题目描述 有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学. 游戏开始时,每人都只 ...
- 【uva 1614】Hell on the Markets(算法效率--贪心)
题意:有一个长度为N的序列A,满足1≤Ai≤i,每个数的正负号不知.请输出一种正负号的情况,使得所有数的和为0.(N≤100000) 解法:(我本来只想静静地继续做一个口胡选手...←_← 但是因为这 ...