C++性能测试(一)

本文介绍了作者在Windows11环境下使用msvc14编译器进行的一次C++性能测试,涉及vector初始化、不同循环方式、传值、传指针和引用、以及求和操作的性能比较。测试结果显示vector未初始化时的动态扩容可能导致性能下降,同时讨论了传参方式对效率的影响。

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_SIZEf1()f2()f3()f4()f5()
100000013651170287771249794325
10000000224171310827613860774957930
10000000014884913710929367376881729747950

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_SIZEf1()f2()f3()f4()f5()f6()
100000073341615925601027533824116
10000000541648594921133649884280339249
1000000006195801006894215256552774386767440570

传值、传指针和引用


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_SIZEf1()f2()f3()f4()
10000008725754089967263
1000000071787647097023365450
100000000647038682266687028614793

求和


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_SIZEf1()f2()f3()
100000629688501
1000000500810930-
100000004849669288-
100000000389700612720-

注:由于数组的大小超出范围,所以MAX_SIZE为1000000及更大时没有测试数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值