(原創) std::vector与std::list的执行速度比较 (C/C++) (STL)

STL中的container各有专长,最常用的是std::vector,可以完全取代array,第二常用的是std::list。std::vector的优点在于non-sequential access超快,新增数据于数据后端超快,但insert和erase任意资料则相当缓慢;std::list则是insert和erase速度超快,但non-sequential access超慢,此范例以实际时间比较vector和list间的优缺点。

  1/* 
  2(C) OOMusou 2006 http://oomusou.cnblogs.com
  3
  4Filename    : VectorVsList.cpp
  5Compiler    : Visual C++ 8.0
  6Description : Demo the performance difference between std::vector and std::list
  7*/

  8#include <iostream>
  9#include <ctime>
 10#include <vector>
 11#include <list>
 12
 13// Add to Vector at end
 14void addToVectorAtEnd();
 15// Add to List at end
 16void addToListAtEnd();
 17// Calculate time for adding to end
 18void addToEnd();
 19
 20// Add to Vector anywhere
 21void addToVectorAnywhere();
 22// Add to List anywhere
 23void addToListAnywhere();
 24// Calculate time for adding anywhere
 25void addAnywhere();
 26
 27// Remove from Vector anywhere
 28void removeFromVectorAnywhere();
 29// Remove from List anywhere
 30void removeFromListAnywhere();
 31// Calculate time for removing anywhere
 32void removeAnywhere();
 33
 34// Non-sequential access to Vector
 35void nonSequentialAccessToVector();
 36// Non-sequential access to List
 37void nonSequentialAccessToList();
 38// Caculate time for non-sequential access to 
 39void nonSequentialAccess();
 40
 41std::vector<int> vector1;
 42std::list<int>   list1;
 43
 44int main() {
 45  // Calculate time for adding to end
 46  addToEnd();
 47
 48  // Calculate time for adding anywhere
 49  addAnywhere();
 50
 51  // Calculate time for removing anywhere
 52  removeAnywhere();
 53
 54  // Caculate time for non-sequential access to 
 55  nonSequentialAccess();
 56}

 57
 58// Add to Vector at end
 59void addToVectorAtEnd() {
 60  for(int i=0; i != 1000000++i) {
 61    vector1.push_back(i);
 62  }

 63}

 64
 65// Add to List at end
 66void addToListAtEnd() {
 67  for(int i=0; i != 1000000++i) {
 68    list1.push_back(i);
 69  }

 70}

 71
 72// Calculate time for adding to end
 73void addToEnd() {
 74  clock_t addToVectorAtEndClock = clock();
 75  addToVectorAtEnd();
 76  addToVectorAtEndClock = clock() - addToVectorAtEndClock;
 77
 78  std::cout << "Vector Insertion at the end Process time:" << (double)addToVectorAtEndClock/CLOCKS_PER_SEC << " sec" << std::endl;
 79
 80  clock_t addToListAtEndClock = clock();
 81  addToListAtEnd();
 82  addToListAtEndClock = clock() - addToListAtEndClock;
 83
 84  std::cout << "List Insertion at the end Process time:" << (double)addToListAtEndClock/CLOCKS_PER_SEC << " sec" << std::endl;
 85
 86  if (addToVectorAtEndClock < addToListAtEndClock) {
 87    std::cout << "Insertion at the end : Vector wins" << std::endl;
 88  }

 89  else {
 90    std::cout << "Insertion at the end : List wins" << std::endl;
 91  }

 92}

 93
 94// Add to Vector anywhere
 95void addToVectorAnywhere() {
 96  // Add to 50000th
 97  std::vector<int>::iterator iter = vector1.begin();
 98
 99  for(int i = 0; i <= 500++i) {
100    ++iter;
101    iter = vector1.insert(iter,i);
102  }

103}

104
105// Add to List anywhere
106void addToListAnywhere() {
107  // Add to 50000th
108  std::list<int>::iterator iter = list1.begin();
109
110  for(int i = 0; i != 500++i) {
111    ++iter;
112    iter = list1.insert(iter,i);
113  }

114}

115
116// Calculate time for adding anywhere
117void addAnywhere() {
118  clock_t addToVectorAnywhereClock = clock();
119  addToVectorAnywhere();
120  addToVectorAnywhereClock = clock() - addToVectorAnywhereClock;
121
122  std::cout << "Vector Insertion anywhere Process time:" << (double)addToVectorAnywhereClock/CLOCKS_PER_SEC << " sec" << std::endl;
123
124  clock_t addToListAnywhereClock = clock();
125  addToListAnywhere();
126  addToListAnywhereClock = clock() - addToListAnywhereClock;
127
128  std::cout << "List Insertion anywhere Process time:" << (double)addToListAnywhereClock/CLOCKS_PER_SEC << " sec" << std::endl;
129
130  if (addToVectorAnywhereClock < addToListAnywhereClock) {
131    std::cout << "Insertion anywhere : Vector wins" << std::endl;
132  }

133  else {
134    std::cout << "Insertion anywhere : List wins" << std::endl;
135  }

136}

137
138// Remove from Vector anywhere
139void removeFromVectorAnywhere() {
140  std::vector<int>::iterator iter = vector1.begin();
141
142  for(int i = 0; i != 500++i) {
143    ++iter;
144    iter = vector1.erase(iter);
145  }

146}

147
148// Remove from List anywhere
149void removeFromListAnywhere() {
150  std::list<int>::iterator iter = list1.begin();
151
152  for(int i = 0; i != 500++i) {
153    ++iter;
154    iter = list1.erase(iter);
155  }

156}

157
158// Calculate time for removing anywhere
159void removeAnywhere() {
160  clock_t removeFromVectorAnywhereClock = clock();
161  removeFromVectorAnywhere();
162  removeFromVectorAnywhereClock = clock() - removeFromVectorAnywhereClock;
163
164  std::cout << "Vector deletion anywhere Process time:" << (double)removeFromVectorAnywhereClock/CLOCKS_PER_SEC << " sec" << std::endl;
165
166  clock_t removeFromListAnywhereClock = clock();
167  removeFromListAnywhere();
168  removeFromListAnywhereClock = clock() - removeFromListAnywhereClock;
169
170  std::cout << "List deletion anywhere Process time:" << (double)removeFromListAnywhereClock/CLOCKS_PER_SEC << " sec" << std::endl;
171
172  if (removeFromVectorAnywhereClock < removeFromListAnywhereClock) {
173    std::cout << "Deletion anywhere : Vector wins" << std::endl;
174  }

175  else {
176    std::cout << "Deletion anywhere : List wins" << std::endl;
177  }

178}

179
180// Non-sequential access to Vector
181void nonSequentialAccessToVector() {
182  for(int i = 0; i != 10000++i) {
183    int m = vector1.at(i);
184  }

185}

186
187// Non-sequential access to List
188void nonSequentialAccessToList() {
189  for(int i = 0; i != 10000++i) {
190    std::list<int>::const_iterator iter = list1.begin();
191    for(int k = 0; k <= i; ++k) {
192      ++iter;
193    }

194
195    int m = (*iter);
196  }

197}

198
199// Caculate time for non-sequential access to 
200void nonSequentialAccess() {
201  clock_t nonSequentialAccessToVectorClock = clock();
202  nonSequentialAccessToVector();
203  nonSequentialAccessToVectorClock = clock() - nonSequentialAccessToVectorClock;
204
205  std::cout << "Vector non-sequential access Process time:" << (double)nonSequentialAccessToVectorClock/CLOCKS_PER_SEC << " sec" << std::endl;
206
207  clock_t nonSequentialAccessToListClock = clock();
208  nonSequentialAccessToList();
209  nonSequentialAccessToListClock = clock() - nonSequentialAccessToListClock;
210
211  std::cout << "List non-sequential access Process time:" << (double)nonSequentialAccessToListClock/CLOCKS_PER_SEC << " sec" << std::endl;
212
213  if (nonSequentialAccessToVectorClock < nonSequentialAccessToListClock) {
214    std::cout << "Non-sequential : Vector wins" << std::endl;
215  }

216  else {
217    std::cout << "Non-sequential : List wins" << std::endl;
218  }

219}

执行结果

(Debug mode)
 1Vector Insertion at the end Process time:3.094 sec
 2List Insertion at the end Process time:10.205 sec
 3Insertion at the end : Vector wins
 4Vector Insertion anywhere Process time:5.548 sec
 5List Insertion anywhere Process time:0.01 sec
 6Insertion anywhere : List wins
 7Vector deletion anywhere Process time:4.756 sec
 8List deletion anywhere Process time:0.011 sec
 9Deletion anywhere : List wins
10Vector non-sequential access Process time:0.11 sec
11List non-sequential access Process time:21.12 sec
12Non-sequential : Vector wins

(Release Mode)
 1Vector Insertion at the end Process time:0.06 sec
 2List Insertion at the end Process time:0.39 sec
 3Insertion at the end : Vector wins
 4Vector Insertion anywhere Process time:4.757 sec
 5List Insertion anywhere Process time:0 sec
 6Insertion anywhere : List wins
 7Vector deletion anywhere Process time:4.717 sec
 8List deletion anywhere Process time:0 sec
 9Deletion anywhere : List wins
10Vector non-sequential access Process time:0 sec
11List non-sequential access Process time:0.491 sec
12Non-sequential : Vector wins

可见经过compiler优化后,速度差异非常明显。

posted on   真 OO无双  阅读(15257)  评论(3编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示