C++性能测试(一)
写在前面
测试环境:
操作系统:window11
编译器:msvc14
备注:
建议有c++基础的再来看这篇博客,因为我不会解释c++的一些函数或者方法(因为我可能也是现查的),当然有什么问题可以评论区提问,我会的就回答不会的可以搜索。
该测试结果仅是我在学习c++时为了测试一些函数或者方法而得到的,结果并不严谨也不具有说服力。我的目的也不是为了说清楚c++的性能问题,我不对测试的结果做任何结论但是会以我所知道的东西对这些结果做简单解释,所以这些测试结果仅供大家参考也欢迎大家批评指正。
测试方式
int main()
{
steady_clock::time_point t1;
steady_clock::time_point t2;
t1 = steady_clock::now();
f1();
t2 = steady_clock::now();
std::cout << "f1() take " << duration_cast<microseconds>(t2 - t1).count() << " microsecond." << endl;
return 0;
}
测试结果(以下结果时间单位均为微秒)
vector初始化
void f1() {
vector<int> v(MAX_SIZE);
}
void f2() {
vector<int> v(MAX_SIZE, 0);
}
void f3() {
vector<int> v(MAX_SIZE, 99);
}
void f4() {
vector<int> v(MAX_SIZE);
for (int i = 0; i < MAX_SIZE; ++i) {
v[i] = i;
}
}
void f5() {
vector<int> v;
for (int i = 0; i < MAX_SIZE; ++i) {
v.push_back(i);
}
}
输出结果
MAX_SIZE | f1() | f2() | f3() | f4() | f5() |
---|---|---|---|---|---|
1000000 | 1365 | 1170 | 28777 | 12497 | 94325 |
10000000 | 22417 | 13108 | 276138 | 60774 | 957930 |
100000000 | 148849 | 137109 | 2936737 | 688172 | 9747950 |
f2()速度f1()快,有谁懂?(滑稽)
f4()为什么比f5()快:
因为vector的大小是动态分配的,里面有size和capacity两个重要的属性,如果开始不初始化大小的vector(比如f5()中vector),他的capacity为0。capacity会随着vector的size的增加而增加,这意味如果一开始vector的capacity为100,size增加到70时vector可能就要扩充容量为200(随便说的)了,当vector找到一个足够的内存时会将数据从原来的内存拷贝到新的内存。因为f5()的没有初始化容量,所以需要花大量时间拷贝数据。
循环
void f1(vector<int>& v) {
int len = v.size();
for (int i = 0; i < len; ++i) {
v[i] = 1;
}
}
void f2(vector<int>& v) {
for (int i = 0; i < v.size(); ++i) {
v[i] = 1;
}
}
void f3(vector<int>& v) {
for (int& i : v) {
i = 1;
}
}
void f4(vector<int>& v) {
int i = v.size();
while (i--) {
v[i] = 1;
}
}
void f5(vector<int>& v) {
for_each(v.begin(), v.end(), [](int& i) {
i = 1; });
}
inline void test(int& i) {
i = 1; }
void f6(vector<int>& v) {
for_each(v.begin(), v.end(), test);
}
输出结果
MAX_SIZE | f1() | f2() | f3() | f4() | f5() | f6() |
---|---|---|---|---|---|---|
1000000 | 7334 | 16159 | 2560 | 10275 | 3382 | 4116 |
10000000 | 54164 | 85949 | 21133 | 64988 | 42803 | 39249 |
100000000 | 619580 | 1006894 | 215256 | 552774 | 386767 | 440570 |
传值、传指针和引用
void add_ref1(int& v,int &i) {
v = i; }
int& add_ref2(int& v, int& i) {
v = i; return v; }
void add_ptr(int* v, int& i) {
*v = i; }
int add_val(int v, int& i) {
v = i; return v; }
void f1(vector<int> v) {
int j = 0;
for (int& i : v) {
add_ref1(i,++j);
}
}
void f2(vector<int> v) {
int j = 0;
for (int& i : v) {
i = add_ref2(i,++j);
}
}
void f3(vector<int> v) {
int j = 0;
for (int& i : v) {
add_ptr(&i,++j);
}
}
void f4(vector<int> v) {
int j = 0;
for (int& i : v) {
i = add_val(i,++j);
}
}
输出结果
MAX_SIZE | f1() | f2() | f3() | f4() |
---|---|---|---|---|
1000000 | 8725 | 7540 | 8996 | 7263 |
10000000 | 71787 | 64709 | 70233 | 65450 |
100000000 | 647038 | 682266 | 687028 | 614793 |
求和
void f1(vector<int> v) {
int sum = 0;
for (int& i : v) {
sum += i;
}
cout << sum << endl;
}
void f2(vector<int> v) {
int sum = accumulate(v.begin(), v.end(), 0);
cout << sum << endl;
}
void f3(int *v) {
int sum = accumulate(v, v + MAX_SIZE, 0);
cout << sum << endl;
}
输出结果
MAX_SIZE | f1() | f2() | f3() |
---|---|---|---|
100000 | 629 | 688 | 501 |
1000000 | 5008 | 10930 | - |
10000000 | 48496 | 69288 | - |
100000000 | 389700 | 612720 | - |
注:由于数组的大小超出范围,所以MAX_SIZE为1000000及更大时没有测试数据。