C++ std::map for 循环效率

写法1:常规迭代遍历

for (auto it = m_mapUser.begin(); it != m_mapUser.end(); ++it)
{
	//todo
}

//评价:很常用的写法,效率也很高

写法2:auto遍历

for (auto it : m_mapUser)
{
	//todo
}

//评价:写法简单,效率低,map数据量很小的时候适用,数据量大坚决不能这么写
//测试数据10w条记录,遍历一次需要24s,100w条需要270s

写法3:auto遍历(改进)

for (auto& it : m_mapUser) // 很简单的改动
{
	//todo
}

//评价:写法简单,效率高,适合大数据量遍历,
//自测:比写法2的效率提升20+倍,甚至100+倍,当然,这也许和主键复杂度有关系

关于【写法1】&【写法3】效率对比

在release模式下,两种写法的效率都差不多,但在debug模式下,写法3明显比写法1更优,生产环境根据实际情况选择,各有利弊写法1可以删除项,写法3代码简洁,却无法删除项。

// 测试代码
int main()
{
#if 1
	int n = 10000000;
	std::map<int, int> m_mapUser;
	for (auto i = 0; i < n; ++i)
	{
		m_mapUser[i] = i;
	}

	int nCount = 10;
	for(auto i = 0; i < nCount; ++i)
	{
		ULONGLONG ullTime1 = GetTickCount64();
		for (auto it = m_mapUser.begin(); it != m_mapUser.end(); ++it)
		{
			//todo
		}

		ULONGLONG ullTime2 = GetTickCount64();
		for (auto& it : m_mapUser) // 很简单的改动
		{
			//todo

		}
		ULONGLONG ullTime3 = GetTickCount64();
		printf("%llu,%llu\n", ullTime2 - ullTime1, ullTime3 - ullTime2);
	}
	system("pause");
#endif
}
【时间单位:毫秒】
n=100万次

debug模式下得到以下数据,写法3明显更快
写法1耗时:360, 写法3耗时:156
写法1耗时:359, 写法3耗时:157
写法1耗时:359, 写法3耗时:156
写法1耗时:360, 写法3耗时:171
写法1耗时:344, 写法3耗时:172
写法1耗时:344, 写法3耗时:172
写法1耗时:359, 写法3耗时:172
写法1耗时:344, 写法3耗时:172
写法1耗时:359, 写法3耗时:172
写法1耗时:359, 写法3耗时:172

release模式下得到以下数据,耗时差不多
写法1耗时:15, 写法3耗时:16
写法1耗时:16, 写法3耗时:15
写法1耗时:16, 写法3耗时:15
写法1耗时:16, 写法3耗时:16
写法1耗时:15, 写法3耗时:16
写法1耗时:16, 写法3耗时:15
写法1耗时:16, 写法3耗时:15
写法1耗时:16, 写法3耗时:16
写法1耗时:15, 写法3耗时:16
写法1耗时:16, 写法3耗时:15
n=1000万次

debug模式下得到以下数据,明显写法3更快
写法1耗时:3547, 写法3耗时:1688
写法1耗时:3765, 写法3耗时:2157
写法1耗时:4547, 写法3耗时:2218
写法1耗时:4719, 写法3耗时:2250
写法1耗时:4594, 写法3耗时:2281
写法1耗时:4781, 写法3耗时:2266
写法1耗时:4672, 写法3耗时:2125
写法1耗时:4687, 写法3耗时:2203
写法1耗时:4047, 写法3耗时:1735
写法1耗时:3703, 写法3耗时:1734

release模式下得到以下数据,耗时伯仲间
写法1耗时:171, 写法3耗时:157
写法1耗时:172, 写法3耗时:187
写法1耗时:125, 写法3耗时:141
写法1耗时:140, 写法3耗时:141
写法1耗时:125, 写法3耗时:141
写法1耗时:140, 写法3耗时:125
写法1耗时:141, 写法3耗时:140
写法1耗时:125, 写法3耗时:141
写法1耗时:141, 写法3耗时:140
写法1耗时:125, 写法3耗时:141

n=1亿次
debug模式下得到以下数据,不测了,耗时太长

release模式下得到以下数据,数据依然差不多
写法1耗时:2078, 写法3耗时:1969
写法1耗时:1344, 写法3耗时:1359
写法1耗时:1359, 写法3耗时:1750
写法1耗时:1344, 写法3耗时:1328
写法1耗时:1594, 写法3耗时:1594
写法1耗时:1640, 写法3耗时:1625
写法1耗时:1610, 写法3耗时:1656
写法1耗时:1641, 写法3耗时:1656
写法1耗时:1640, 写法3耗时:1657
写法1耗时:1672, 写法3耗时:1687

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值