C++性能测试(一)

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及更大时没有测试数据。

猜你喜欢

转载自blog.csdn.net/yyy90/article/details/121443200