C++ bool和int类型的vector容器以及C风格数组访问速度比较

在做一道LeetCode练习题(416.分割等和子集)时,我发现我模仿官方答案写的程序运行速度比官方答案耗时多几倍,于是就开始了一行一行的比对,最后发现原来是vector<int>和vector<bool>的区别。

对于只需要区分true或false的情况,使用bool变量是非常清晰的,而使用int变量则显得不太容易阅读(除非加注释)。而且,毕竟bool变量号称只占1个字节,而int要占8字节(64位系统)。直观上肯定觉得bool型用起来会更快。

但是,我发现vector<int>要比vector<bool>访问更快!这很有意思。测试代码如下:

#include <iostream>
#include <vector>
#include <ctime>

using namespace std;

int main()
{
	vector<int> a(100000,0);
	clock_t time_start = clock();
	for (int i = 0; i < 100000; i++)
		a[i] = 1;
	clock_t time_end = clock();
	cout << "int type, time use:" << 1000 * (time_end - time_start) / (double)CLOCKS_PER_SEC << "ms" << endl;

	vector<bool> b(100000,0);
	time_start = clock();
	for (int i = 0; i < 100000; i++)
		b[i] = 1;
	time_end = clock();
	cout << "bool type, time use:" << 1000 * (time_end - time_start) / (double)CLOCKS_PER_SEC << "ms" << endl;


	getchar();
	return 0;
}

对于单纯的赋值运算,int型vector耗时45ms,而bool型vector耗时191ms。

这访问速度差了4倍左右,难怪我的代码不如官方答案的快。

另一方面,除了vector容器,我还使用C风格数组对int型和bool型做了类似的访问速度实验,代码如下:

#include <iostream>
#include <vector>
#include <ctime>

using namespace std;

int main()
{
	int a[100000];
	clock_t time_start = clock();
	for (int i = 0; i < 100000; i++)
		for(int j = 0;j<1000;j++)//由于耗时太短,耗时显示0ms,此处增加了1000次循环
		a[i] = 1;
	clock_t time_end = clock();
	cout << "int type, time use:" << 1000 * (time_end - time_start) / (double)CLOCKS_PER_SEC << "ms" << endl;

	bool b[100000];
	time_start = clock();
	for (int i = 0; i < 100000; i++)
		for (int j = 0; j<1000; j++)
		b[i] = 1;
	time_end = clock();
	cout << "bool type, time use:" << 1000 * (time_end - time_start) / (double)CLOCKS_PER_SEC << "ms" << endl;


	getchar();
	return 0;
}

因为访问速度太快,访问时间均显示0ms,我将循环增加了1000倍来做精确对比。由于系统不稳定,我进行了多次测试,两者速度不想上下,基本都是260ms~280ms。(这个访问速度基本达到了vector容器的100倍以上)

综上,我们可以发现:

1. 对于传统C风格的int数组或bool数组,其访问效率是相仿的,100000个元素,全部访问赋值耗时大约0.26ms。

2. 如果使用C++的vector容器,int数组和bool数组的访问效率有显著差别,100000个元素,全部访问赋值的情况下,int型vector耗时45ms,bool型vector耗时191ms,速度相差4倍左右。

总结一下我的感受就是,作为我学会使用的第一个C++容器,vector用起来太舒服了,但它也真的太耗时了。不比不知道,一比吓一跳。vector的访问速度比传统C风格数组慢了100倍,这在数据量大的情况下太可怕了。就像我之前的博客C风格数组和C++vector容器的越界问题中写的,vector有着很多好的性质,比如越界访问会有提醒,能减少低级错误造成的bug,但这也牺牲了系统的时间效率。面向对象的C++在使用了容器类对象的情况下,效率就比面向过程的C慢了很多,而且对于装有不同类型元素的vector容器,其访问速度也有区别。因此,我也理解为什么说C语言经久不衰、使用广泛了,因为它更加底层的性质保证了它的效率。虽然C风格数组定义起来更麻烦,也没有防止越界访问的保护措施,也没有方便的配套函数(或叫做类方法),但它的访问效率是绝对有保证的。在程序员谨慎使用的情况下,确实可以实现效率和安全双赢(只是代码看起来繁琐了一些,可读性稍差一点)。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值