• 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 }
  • 相关阅读:
    KINDLE 小说下载--超级书库
    修改PR Cs6,PS Cs6,AU Cs6的启动界面
    SQLMAP用户手册
    Burp Suite 实战指南--说明书
    XSS跨站测试代码
    万能密码字典
    python数据结构之队列(一)
    python数据结构之栈
    python实现链表(二)
    python实现链表(一)
  • 原文地址:https://www.cnblogs.com/qyit/p/14179150.html
Copyright © 2020-2023  润新知