测试对象类型不同,数量级不同时,表现具有差异:

测试数据对象为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)的更多相关文章

  1. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  2. 【C++11应用】基于C++11及std::thread实现的线程池

    目录 基于C++11及std::thread实现的线程池 基于C++11及std::thread实现的线程池 线程池源码: #pragma once #include <functional&g ...

  3. 编程杂谈——std::vector与List<T>的性能比较

    昨天在比较完C++中std::vector的两个方法的性能差异并留下记录后--编程杂谈--使用emplace_back取代push_back,今日尝试在C#中测试对应功能的性能. C#中对应std:: ...

  4. Item 21: 比起直接使用new优先使用std::make_unique和std::make_shared

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 让我们先从std::make_unique和std::make_s ...

  5. 使用std::map和std::list存放数据,消耗内存比实际数据大得多

    使用std::map和std::list存放数据,消耗内存比实际数据大得多 场景:项目中需要存储一个结构,如下程序段中TEST_DATA_STRU,结构占24B.但是使用代码中的std::list&l ...

  6. std::array,std::vector,基于范围的for循环

    std::array除了有传统数组支持随机访问.效率高.存储大小固定等特点外,还支持迭代器访问.获取容量.获得原始指针等高级功能.而且它还不会退化成指针T *给开发人员造成困惑. for( 元素名变量 ...

  7. C++基于范围的for循环性能测试(针对std::vector)

    1.代码如下: void output1(int x){ if (x == 10000000) { std::cout << x << std::endl; } }const ...

  8. C++ std::unordered_map使用std::string和char *作key对比

    最近在给自己的服务器框架加上统计信息,其中一项就是统计创建的对象数,以及当前还存在的对象数,那么自然以对象名字作key.但写着写着,忽然纠结是用std::string还是const char *作ke ...

  9. std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义

    std::vector<Channel2*> m_allChannels;容器,以及如何根据channelid的意义 这个容器保存了所有客户端连接的channel Channel2* Li ...

随机推荐

  1. SparkStreaming算子操作,Output操作

    SparkStreaming练习之StreamingTest,UpdateStateByKey,WindowOperator 一.SparkStreaming算子操作 1.1 foreachRDD 1 ...

  2. Codeforces Round #626 (Div. 2) B. Count Subrectangles

    题目连接:https://codeforces.com/contest/1323/problem/B 题意:给一个大小为n的a数组,一个大小为m的b数组,c数组是二维数组c[i][j]=a[i]*b[ ...

  3. c语言实现--顺序表操作

    经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1;线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2;采用的实现方式:一段地址连 ...

  4. HDU 1565 方格取数 状压dp

    题目: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. Input 包括多 ...

  5. Codeforces Round #579 (Div. 3) D2. Remove the Substring (hard version) (思维,贪心)

    题意:给你一个模式串\(t\),现在要在主串\(s\)中删除多个子串,使得得到的\(s\)的子序列依然包含\(t\),问能删除的最长子串长度. 题解:首先,我们不难想到,我们可以选择\(s\)头部到最 ...

  6. Codeforces Global Round 11 B. Chess Cheater (贪心,结构体排序)

    题意:你和朋友进行了\(n\)个回合的棋艺切磋,没有平局,每次要么输要么赢,每次赢可以得一分,假如前一局也赢了,那么可以得两分,结果已成定局,但是你确可以作弊,最多修改\(k\)个回合的结果,问你作弊 ...

  7. Acwing 154 滑动窗口(单调队列)经典模板

    给定一个大小为n≤106n≤106的数组. 有一个大小为k的滑动窗口,它从数组的最左边移动到最右边. 您只能在窗口中看到k个数字. 每次滑动窗口向右移动一个位置. 以下是一个例子: 该数组为[1 3 ...

  8. Codeforces Round #656 (Div. 3) A. Three Pairwise Maximums (数学)

    题意:给你三个正整数\(x\),\(y\),\(z\),问能够找到三个正整数\(a\),\(b\),\(c\),使得\(x=max(a,b)\),\(y=max(a,c)\),\(z=max(b,c) ...

  9. 【一天一个基础系列】- java之泛型篇

    简介 说起各种高级语言,不得不谈泛型,当我们在使用java集合的时候,会发现集合有个缺点:把一个对象"丢进"集合之后,集合就会"忘记"这个对象的数据类型,当再次 ...

  10. ssh配置方面小实验①

    注意:sshd_config配置文件有些特殊:注释掉的选项,并不是不生效的,而是默认生效选项.使用某选项时,要先取消注释,再修改为yes或no关于效率和安全的说明:安全:telnet < ssh ...