一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

  使用Qt中的容器给C++开发带来很大的便利,而且QVector和QMap等容器扩展的一些成员函数也是很方便的。但是Qt的这些容器和STL库的容器比,效率到底怎么样?我就写了几个简单的遍历的例子,测试了QVector、vector等容器的那些方法效率更高。

测试环境:

系统:windows 10

编译器:MingGW mingw5.3.0

Qt版本:5.9.7

硬件:i7 8代,16G内存

一. 测试QVector和vector的各种遍历的方法:

  1 void CompareQVectorAndVectorTraverse()
  2 {
  3     int size = 100000000;
  4     QVector<int> qv(size, 1);
  5     vector<int> v(size, 1);
  6  
  7     printf("vector size: %d\n", size);
  8 // const_iterator比较
  9     QVector<int>::ConstIterator cqvit;
 10     int sum = 0;
 11     qint64 start = QDateTime::currentDateTime().toMSecsSinceEpoch();
 12     for( cqvit = qv.constBegin(); cqvit != qv.constEnd(); ++cqvit)
 13     {
 14         sum += *cqvit;
 15     }
 16     qint64 end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 17     printf( "qvector ConstIterator %dms\n", end - start );
 18     printf("%d\n", sum);
 19  
 20     QVector<int>::const_iterator cqvit2;
 21     sum = 0;
 22     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
 23     for( cqvit2 = qv.cbegin(); cqvit2 != qv.cend(); ++cqvit2)
 24     {
 25         sum += *cqvit2;
 26     }
 27     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 28     printf( "qvector const_iterator %dms\n", end - start );
 29     printf("%d\n", sum);
 30  
 31     vector<int>::const_iterator cvit;
 32     sum = 0;
 33     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
 34     for( cvit = v.cbegin(); cvit != v.cend(); ++cvit )
 35     {
 36         sum += *cvit;
 37     }
 38     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 39     printf( "stl vector const_iterator %dms\n", end - start );
 40     printf("%d\n", sum);
 41  
 42 // iterator比较
 43     QVector<int>::iterator it;
 44     sum = 0;
 45     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
 46     for( it = qv.begin(); it != qv.end(); ++it)
 47     {
 48         sum += *it;
 49     }
 50     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 51     printf( "qvector iterator %dms\n", end - start );
 52     printf("%d\n", sum);
 53  
 54     vector<int>::iterator vit;
 55     sum = 0;
 56     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
 57     for( vit = v.begin(); vit != v.end(); ++vit )
 58     {
 59         sum += *vit;
 60     }
 61     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 62     printf( "stl vector iterator %dms\n", end - start );
 63     printf("%d\n", sum);
 64  
 65 //[]比较
 66     sum = 0;
 67     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
 68     for( int i = 0; i < qv.size(); ++i)
 69     {
 70         sum += qv[i];
 71     }
 72     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 73     printf( "QVector [] %dms\n", end - start );
 74     printf("%d\n", sum);
 75  
 76  
 77     sum = 0;
 78     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
 79     for( int i = 0; i < v.size(); ++i)
 80     {
 81         sum += v[i];
 82     }
 83     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 84     printf( "stl vector [] %dms\n", end - start );
 85     printf("%d\n", sum);
 86  
 87 //.data()比较
 88     sum = 0;
 89     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
 90     int *data = qv.data();
 91     for( int i = 0; i < qv.size(); ++i)
 92     {
 93         sum += data[i];
 94     }
 95     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
 96     printf( "QVector .data() %dms\n", end - start );
 97     printf("%d\n", sum);
 98  
 99     sum = 0;
100     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
101     data = v.data();
102     for( int i = 0; i < v.size(); ++i)
103     {
104         sum += data[i];
105     }
106     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
107     printf( "stl vector .data() %dms\n", end - start );
108     printf("%d\n", sum);
109  
110 //:比较
111     sum = 0;
112     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
113     for( int val : qv )
114     {
115         sum += val;
116     }
117     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
118     printf( "QVector : %dms\n", end - start );
119     printf("%d\n", sum);
120  
121     sum = 0;
122     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
123     for( int val : v)
124     {
125         sum += val;
126     }
127     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
128     printf( "stl vector : %dms\n", end - start );
129     printf("%d\n", sum);
130 }

运行结果:

 1 vector size: 100000000
 2 qvector ConstIterator 1252ms
 3 100000000
 4 qvector const_iterator 1254ms
 5 100000000
 6 stl vector const_iterator 1318ms
 7 100000000
 8 qvector iterator 4233ms
 9 100000000
10 stl vector iterator 1319ms
11 100000000
12 QVector [] 4862ms
13 100000000
14 stl vector [] 456ms
15 100000000
16 QVector .data() 275ms
17 100000000
18 stl vector .data() 296ms
19 100000000
20 QVector : 187ms
21 100000000
22 stl vector : 870ms
23 100000000

二. 测试QMap和map的各种遍历的方法:

 1 void CompareQMapAndMapTraverse()
 2 {
 3     int size = 1000000;
 4     qint64 sum = 0;
 5     qint64 start, end;
 6     map<string, int> m;
 7     char *tmps = new char[10];
 8     for( int i = 0; i < size; ++i )
 9     {
10         sprintf( tmps, "%s%d", "a", i);
11         m.insert( make_pair(tmps, i) );
12     }
13     QMap<string, int> qm(m);
14     printf("map size: %d\n", m.size());
15  
16  
17 //iterator比较
18     QMap<string, int>::iterator qmit;
19     sum = 0;
20     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
21     for(qmit = qm.begin(); qmit != qm.end(); ++qmit )
22     {
23         sum += qmit.value();
24     }
25     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
26     printf( "QMap iterator %dms\n", end - start );
27     printf("%d\n", sum);
28  
29     map<string, int>::iterator mit;
30     sum = 0;
31     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
32     for( mit = m.begin(); mit != m.end(); ++mit )
33     {
34         sum += mit->second;
35     }
36     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
37     printf( "stl::map iterator %dms\n", end - start );
38     printf("%d\n", sum);
39  
40 //const_iterator比较
41     QMap<string, int>::const_iterator cqmit;
42     sum = 0;
43     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
44     for(cqmit = qm.cbegin(); cqmit != qm.cend(); ++cqmit )
45     {
46         sum += cqmit.value();
47     }
48     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
49     printf( "QMap const_iterator %dms\n", end - start );
50     printf("%d\n", sum);
51  
52     map<string, int>::const_iterator cmit;
53     sum = 0;
54     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
55     for( cmit = m.cbegin(); cmit != m.cend(); ++cmit )
56     {
57         sum += cmit->second;
58     }
59     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
60     printf( "stl::map const_iterator %dms\n", end - start );
61     printf("%d\n", sum);
62  
63     QMap<string, int>::key_iterator qmkeyit;
64     sum = 0;
65     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
66     for( qmkeyit = qm.keyBegin(); qmkeyit != qm.keyEnd(); ++qmkeyit )
67     {
68         sum += qm[*qmkeyit];
69     }
70     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
71     printf( "QMap key_iterator %dms\n", end - start );
72     printf("%d\n", sum);
73  
74     sum = 0;
75     start = QDateTime::currentDateTime().toMSecsSinceEpoch();
76     for( string k : qm.keys() )
77     {
78         sum += qm[k];
79     }
80     end = QDateTime::currentDateTime().toMSecsSinceEpoch();
81     printf( "QMap .keys %dms\n", end - start );
82     printf("%d\n", sum);
83  
84 }

运行结果:

 1 map size: 1000000
 2 QMap iterator 49ms
 3 1783293664
 4 stl::map iterator 38ms
 5 1783293664
 6 QMap const_iterator 33ms
 7 1783293664
 8 stl::map const_iterator 38ms
 9 1783293664
10 QMap key_iterator 407ms
11 1783293664
12 QMap .keys 551ms
13 1783293664

基本和预期的结果差不多,得出结果是QVector最好用for(T &t : qvT)方式。QMap用iterator比较快,而且const_iterator和iterator差不多。

posted on 2024-02-27 19:51  一杯清酒邀明月  阅读(41)  评论(0编辑  收藏  举报