C++11中对容器的各种循环遍历的效率比较
- #include "CycleTimeTst.h"
- #include <string>
- #include <vector>
- #include <list>
- #include <limits>
- #include <assert.h>
- #include <QTime>
- #include <QDebug>
- class TimeUsedGuard
- {
- public:
- TimeUsedGuard(const std::string& msg)
- : m_msg(msg)
- , m_time(QTime::currentTime())
- {
- }
- ~TimeUsedGuard()
- {
- qDebug() << m_msg.c_str() << "use time:" << m_time.elapsed() << "ms";
- }
- private:
- std::string m_msg;
- QTime m_time;
- };
- template <typename T>
- T useData(T val)
- {
- return std::sqrt(val);
- }
- template <typename _Container>
- void normalForLoop(const _Container& datas)
- {
- TimeUsedGuard timeUsedGuard(__FUNCTION__);
- size_t i = ;
- for (; i < datas.size(); ++i)
- {
- useData(datas[i]);
- }
- }
- template <typename _Container>
- void normalForLoopCallSizeOnce(const _Container& datas)
- {
- TimeUsedGuard timeUsedGuard(__FUNCTION__);
- size_t i = ;
- size_t size = datas.size();
- for (; i < size; ++i)
- {
- useData(datas[i]);
- }
- }
- template <typename _Container>
- void iterator(const _Container& datas)
- {
- TimeUsedGuard timeUsedGuard(__FUNCTION__);
- auto pos = datas.cbegin();
- for (; pos != datas.cend(); ++pos)
- {
- useData(*pos);
- }
- }
- template <typename _Container>
- void iteratorCallCEndOnce(const _Container& datas)
- {
- TimeUsedGuard timeUsedGuard(__FUNCTION__);
- auto pos = datas.cbegin();
- auto end = datas.cend();
- for (; pos != end; ++pos)
- {
- useData(*pos);
- }
- }
- template <typename _Container>
- void qtForeach(const _Container& datas)
- {
- TimeUsedGuard timeUsedGuard(__FUNCTION__);
- foreach (auto data, datas)
- {
- useData(data);
- }
- }
- template <typename _Container>
- void stdForeach(const _Container& datas)
- {
- TimeUsedGuard timeUsedGuard(__FUNCTION__);
- std::for_each(datas.cbegin(), datas.cend(), useData<typename _Container::value_type>);
- }
- template <typename _Container>
- void rangeForLoop(const _Container& datas)
- {
- TimeUsedGuard timeUsedGuard(__FUNCTION__);
- for (auto data : datas)
- {
- useData(data);
- }
- }
- template <typename _Container>
- void rangeForLoopReference(const _Container& datas)
- {
- TimeUsedGuard timeUsedGuard(__FUNCTION__);
- for (auto& data : datas)
- {
- useData(data);
- }
- }
- class CycleTimeTst
- {
- public:
- CycleTimeTst();
- };
- CycleTimeTst g_CycleTimeTst;
- CycleTimeTst::CycleTimeTst()
- {
- constexpr unsigned long MAX_AMOUNT = * * ;
- // std::vector<int> datas;
- // for (unsigned long i = 1; i < MAX_AMOUNT; ++i)
- // {
- // datas.push_back(i);
- // }
- std::list<double> datas;
- double d = 1.0;
- for (unsigned long i = ; i < MAX_AMOUNT / ; ++i)
- {
- datas.push_back(d);
- }
- // normalForLoop(datas);
- // normalForLoopCallSizeOnce(datas);
- iterator(datas);
- iteratorCallCEndOnce(datas);
- qtForeach(datas);
- stdForeach(datas);
- rangeForLoop(datas);
- rangeForLoopReference(datas);
- // vector<int> 100 * 1000 * 1000 times, debug & release:
- // normalForLoop use time: 1096 ms normalForLoop use time: 113 ms
- // normalForLoopCallSizeOnce use time: 926 ms normalForLoopCallSizeOnce use time: 106 ms
- // iterator use time: 1941 ms iterator use time: 103 ms
- // iteratorCallCEndOnce use time: 1473 ms iteratorCallCEndOnce use time: 101 ms
- // qtForeach use time: 1846 ms qtForeach use time: 262 ms
- // stdForeach use time: 1488 ms stdForeach use time: 120 ms
- // rangeForLoop use time: 1527 ms rangeForLoop use time: 101 ms
- // rangeForLoopReference use time: 1551 ms rangeForLoopReference use time: 102 ms
- // list<double> 10 * 1000 * 1000 times, debug & release:
- // iterator use time: 206 ms iterator use time: 27 ms
- // iteratorCallCEndOnce use time: 183 ms iteratorCallCEndOnce use time: 26 ms
- // qtForeach use time: 1493 ms qtForeach use time: 743 ms
- // stdForeach use time: 182 ms stdForeach use time: 27 ms
- // rangeForLoop use time: 186 ms rangeForLoop use time: 26 ms
- // rangeForLoopReference use time: 186 ms rangeForLoopReference use time: 27 ms
- }
个人总结:
vector支持随机访问,但无通用性,当采用list后,就不能再使用了,不可取.
迭代器与范围for循环所用时间无明显差异, qt提供的foreach显然是最差的方法, std算法for_each也还可以接受, 但范围for循环好看得多, 更好用啊!
在循环中调用调用cend方法,会频繁创建一个新的迭代器(不停的构造与析构),另外还有函数调用开销,在debug版本结果来看似乎确实有一定的影响,但在realease版本下所花时间几乎相等,也许编译器有优化吧!
C++11中对容器的各种循环遍历的效率比较的更多相关文章
- JavaScript 中的常用12种循环遍历(数组或对象)的方法
1.for 循环 let arr = [1,2,3]; for (let i=0; i<arr.length; i++){ console.log(i,arr[i]) } // 0 1 // 1 ...
- javascript中常见的几种循环遍历
项目开发中,不管是建立在哪个框架基础上,对数据的处理都是必须的,而处理数据离不开各种遍历循环.javascript中循环遍历有很多种方式,记录下几种常见的js循环遍历. 一.for循环 for循环应该 ...
- Java中迭代列表中数据时几种循环写法的效率比较
Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较.虽然网上已经有了类似的文章,但是对他们的结论并不认同. 常见的实现方法: 1.for循环: for(int i = 0; i ...
- js替换数组中的一个对象用for循环遍历
for(let i=0;i<statusList.length;i++){ if (statusList[i]['tableId'] === tableId) { statusList[i]=d ...
- JSP中使用<c:forEach>标签循环遍历元素
转载:http://blog.csdn.net/hero_cheng/article/details/51924577
- 一起学习c++11——c++11中的新增的容器
c++11新增的容器1:array array最早是在boost中出现:http://www.boost.org/doc/libs/1_61_0/doc/html/array.html 当时的初衷是希 ...
- java中Collection容器
1.容器(Collection)也称为集合, 在java中就是指对象的集合. 容器里存放的都只能是对象. 实际上是存放对象的指针(头部地址): 这里对于八种基本数据类型,在集合中实际存的是对应的包装类 ...
- 论C++11 中vector的N种遍历方法
随着C++11标准的出现,C++标准添加了许多有用的特性,C++代码的写法也有比较多的变化. vector是经常要使用到的std组件,对于vector的遍历,本文罗列了若干种写法. (注:本文中代码为 ...
- STL中的容器
STL中的容器 一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist ...
随机推荐
- 关闭会声会影2018提示UEIP.dll找不到指定模块
最近有一些会声会影2018用户反映在关闭后弹出UEIP.dll错误,不知道该怎么办才好,针对这个问题,小编下面为大家介绍下解决方法. 原因分析 出现这个错误跟会声会影安装路径有中文字符是密切相关的,导 ...
- Machine Learning方法总结
Kmeans——不断松弛(?我的理解)模拟,将点集分成几堆的算法(堆数需要自己定). 局部加权回归(LWR)——非参数学习算法,不用担心自变量幂次选择.(因此当二次欠拟合, 三次过拟合的时候不妨尝试这 ...
- ubuntu 设置全局代理
ubuntu配置shadowsocks全局代理 在mac.window平台下都有shadowsocks客户端,因此这两个平台不叙述太多,现在介绍ubuntu下的配置方法. 1.安装python lin ...
- 如何使用HtmlTestRunner让自动化测试报告内容更丰富
原文出自:http://www.cnblogs.com/tsbc/p/4128150.html 简述 使用selenium webdriver + Python做自动化测试,执行完成后要生成测试报告, ...
- “Hello World!”团队第六周的第五次会议
今天是我们团队“Hello World!”团队第六周召开的第五次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码 一 ...
- CS小分队第二阶段冲刺站立会议(5月28日)
昨日成果:昨天对我们的软件的主界面进行了思考,考虑到许多人建议我们团队添加可以自主增加软件快捷键的功能,我对这一想法的可行性和项目总体策划进行评估分析后,决定正式实施:已经完成从电脑上添加文件在我们的 ...
- IDEA + SSH OA 第一天(Hibernate : Mapping (RESOURCE) not found)
切入主题,看看今天的错误是如何发生的: 首先这是我的项目路径,java 是 Sources Root , resources 是 Resources Root ,放了所需要的配置文件,其中 Hiber ...
- DescriptionAttribute Class
指定属性或事件的描述. [Description("The image associated with the control"),Category("Appearanc ...
- SVN版本合并技巧
公司使用了bug管理系统,项目添加新功能时,建一个主工单,再分成多个子工单,将子工单分给多个程序员来开发. 开发人员完成一部分就提交一部分,多个小功能模块就分多次提交到测试主干,然后用测试主干项目发布 ...
- DWZ-JUI+UEditor第二次不显示,UEditor异步加载第二次不显示的解决方案
使用UEditor-1.4.3中遇到第一次跳转到使用UEditor的界面后,编辑器加载正常,返回后第二次再跳转到这个界面就出现UEditor无法正常加载, 也没百度到答案,看UEditor源码,发现这 ...