一、vector、list 插入性能比较
1、linux 下比较
(1)vector
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> nums;
int n = 10000000;
clock_t t1 = clock();
for(int i=0; i<n; i++)
{
nums.push_back(i);
}
clock_t t2= clock();
cout << "vector time = " << t2 - t1 << endl;
return 0;
}
(2)list
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> nums;
int n = 10000000;
clock_t t1 = clock();
for(int i=0; i<n; i++)
{
nums.push_back(i);
}
clock_t t2= clock();
cout << "list time = " << t2 - t1 << endl;
return 0;
}
(3)结果比较
$ time ./vector
vector time = 1092882
real 0m1.116s
user 0m0.984s
sys 0m0.129s
$ time ./list
list time = 5399531
real 0m7.537s
user 0m7.257s
sys 0m0.269s
linux 下,插入 10000000 个数,vector 比 list 快了约 5 倍。
2、windows 下比较
(1)vector
#include <iostream>
#include <vector>
#include <chrono>
using namespace std;
int main()
{
vector<int> nums;
int n = 10000000;
auto t1 = chrono::steady_clock::now();
for (int i = 0; i < n; i++)
{
nums.push_back(i);
}
auto t2 = chrono::steady_clock::now();
chrono::duration<double, std::micro> elapsed = t2 - t1;
cout << "vector time = " << elapsed.count() << endl;
return 0;
}
(2)list
#include <iostream>
#include <list>
#include <chrono>
using namespace std;
int main()
{
list<int> nums;
int n = 10000000;
auto t1 = chrono::steady_clock::now();
for (int i = 0; i < n; i++)
{
nums.push_back(i);
}
auto t2 = chrono::steady_clock::now();
chrono::duration<double, std::micro> elapsed = t2 - t1;
cout << "list time = " << elapsed.count() << endl;
return 0;
}
(3)运行结果
// int n = 10000000;
vector time = 2.04924e+07
list time = 1.74289e+07
// int n = 1000000;
vector time = 1.78127e+06
list time = 2.3419e+06
windows 下,vector 和 list 性能差不多。
3、vector、list 插入性能总结
(1)平台影响
linux 下,插入 10000000 个数,vector 比 list 快了约 5 倍。
windows 下,vector 和 list 性能差不多。
二、vector 扩容
VS 下和 linux 下使用vector时,它们的扩容是不一样的!在vs下为1.5倍扩容,在linux下为2倍扩容。
1、VS 下,1.5 倍扩容
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> nums;
int n = 20;
for (int i = 0; i < n; i++)
{
nums.push_back(i);
cout << i + 1 << ' ' << nums.capacity() << endl;
}
cout << "vector end" << endl;
return 0;
}
1 1 // 0 ---> 0 ---> 1
2 2 // 1 ---> 1.5 ---> 2
3 3 // 2 ---> 3 ---> 3
4 4 // 3 ---> 4.5 ---> 4
5 6 // 4 ---> 6 ---> 6
6 6
7 9 // 6 ---> 9 ---> 9
8 9
9 9
10 13 // 9 ---> 13.5 ---> 13
11 13
12 13
13 13
14 19 // 13 ---> 19.5 ---> 19
15 19
16 19
17 19
18 19
19 19
20 28 // 19 ---> 28.5 ---> 28
每次按当前容量的 1.5 倍扩容,取能放下当前所有元素的最小整数值。