写法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