测试对象类型不同,数量级不同时,表现具有差异:
测试数据对象为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 }