1. #include "CycleTimeTst.h"
  2. #include <string>
  3. #include <vector>
  4. #include <list>
  5. #include <limits>
  6. #include <assert.h>
  7. #include <QTime>
  8. #include <QDebug>
  9.  
  10. class TimeUsedGuard
  11. {
  12. public:
  13. TimeUsedGuard(const std::string& msg)
  14. : m_msg(msg)
  15. , m_time(QTime::currentTime())
  16. {
  17. }
  18. ~TimeUsedGuard()
  19. {
  20. qDebug() << m_msg.c_str() << "use time:" << m_time.elapsed() << "ms";
  21. }
  22.  
  23. private:
  24. std::string m_msg;
  25. QTime m_time;
  26. };
  27.  
  28. template <typename T>
  29. T useData(T val)
  30. {
  31. return std::sqrt(val);
  32. }
  33.  
  34. template <typename _Container>
  35. void normalForLoop(const _Container& datas)
  36. {
  37. TimeUsedGuard timeUsedGuard(__FUNCTION__);
  38. size_t i = ;
  39. for (; i < datas.size(); ++i)
  40. {
  41. useData(datas[i]);
  42. }
  43. }
  44.  
  45. template <typename _Container>
  46. void normalForLoopCallSizeOnce(const _Container& datas)
  47. {
  48. TimeUsedGuard timeUsedGuard(__FUNCTION__);
  49. size_t i = ;
  50. size_t size = datas.size();
  51. for (; i < size; ++i)
  52. {
  53. useData(datas[i]);
  54. }
  55. }
  56.  
  57. template <typename _Container>
  58. void iterator(const _Container& datas)
  59. {
  60. TimeUsedGuard timeUsedGuard(__FUNCTION__);
  61. auto pos = datas.cbegin();
  62. for (; pos != datas.cend(); ++pos)
  63. {
  64. useData(*pos);
  65. }
  66. }
  67.  
  68. template <typename _Container>
  69. void iteratorCallCEndOnce(const _Container& datas)
  70. {
  71. TimeUsedGuard timeUsedGuard(__FUNCTION__);
  72. auto pos = datas.cbegin();
  73. auto end = datas.cend();
  74. for (; pos != end; ++pos)
  75. {
  76. useData(*pos);
  77. }
  78. }
  79.  
  80. template <typename _Container>
  81. void qtForeach(const _Container& datas)
  82. {
  83. TimeUsedGuard timeUsedGuard(__FUNCTION__);
  84. foreach (auto data, datas)
  85. {
  86. useData(data);
  87. }
  88. }
  89.  
  90. template <typename _Container>
  91. void stdForeach(const _Container& datas)
  92. {
  93. TimeUsedGuard timeUsedGuard(__FUNCTION__);
  94. std::for_each(datas.cbegin(), datas.cend(), useData<typename _Container::value_type>);
  95. }
  96.  
  97. template <typename _Container>
  98. void rangeForLoop(const _Container& datas)
  99. {
  100. TimeUsedGuard timeUsedGuard(__FUNCTION__);
  101. for (auto data : datas)
  102. {
  103. useData(data);
  104. }
  105. }
  106.  
  107. template <typename _Container>
  108. void rangeForLoopReference(const _Container& datas)
  109. {
  110. TimeUsedGuard timeUsedGuard(__FUNCTION__);
  111. for (auto& data : datas)
  112. {
  113. useData(data);
  114. }
  115. }
  116.  
  117. class CycleTimeTst
  118. {
  119. public:
  120. CycleTimeTst();
  121. };
  122.  
  123. CycleTimeTst g_CycleTimeTst;
  124. CycleTimeTst::CycleTimeTst()
  125. {
  126. constexpr unsigned long MAX_AMOUNT = * * ;
  127.  
  128. // std::vector<int> datas;
  129. // for (unsigned long i = 1; i < MAX_AMOUNT; ++i)
  130. // {
  131. // datas.push_back(i);
  132. // }
  133. std::list<double> datas;
  134. double d = 1.0;
  135. for (unsigned long i = ; i < MAX_AMOUNT / ; ++i)
  136. {
  137. datas.push_back(d);
  138. }
  139.  
  140. // normalForLoop(datas);
  141. // normalForLoopCallSizeOnce(datas);
  142. iterator(datas);
  143. iteratorCallCEndOnce(datas);
  144. qtForeach(datas);
  145. stdForeach(datas);
  146. rangeForLoop(datas);
  147. rangeForLoopReference(datas);
  148. // vector<int> 100 * 1000 * 1000 times, debug & release:
  149. // normalForLoop use time: 1096 ms normalForLoop use time: 113 ms
  150. // normalForLoopCallSizeOnce use time: 926 ms normalForLoopCallSizeOnce use time: 106 ms
  151. // iterator use time: 1941 ms iterator use time: 103 ms
  152. // iteratorCallCEndOnce use time: 1473 ms iteratorCallCEndOnce use time: 101 ms
  153. // qtForeach use time: 1846 ms qtForeach use time: 262 ms
  154. // stdForeach use time: 1488 ms stdForeach use time: 120 ms
  155. // rangeForLoop use time: 1527 ms rangeForLoop use time: 101 ms
  156. // rangeForLoopReference use time: 1551 ms rangeForLoopReference use time: 102 ms
  157.  
  158. // list<double> 10 * 1000 * 1000 times, debug & release:
  159. // iterator use time: 206 ms iterator use time: 27 ms
  160. // iteratorCallCEndOnce use time: 183 ms iteratorCallCEndOnce use time: 26 ms
  161. // qtForeach use time: 1493 ms qtForeach use time: 743 ms
  162. // stdForeach use time: 182 ms stdForeach use time: 27 ms
  163. // rangeForLoop use time: 186 ms rangeForLoop use time: 26 ms
  164. // rangeForLoopReference use time: 186 ms rangeForLoopReference use time: 27 ms
  165. }

个人总结:

vector支持随机访问,但无通用性,当采用list后,就不能再使用了,不可取.

迭代器与范围for循环所用时间无明显差异, qt提供的foreach显然是最差的方法, std算法for_each也还可以接受, 但范围for循环好看得多, 更好用啊!

在循环中调用调用cend方法,会频繁创建一个新的迭代器(不停的构造与析构),另外还有函数调用开销,在debug版本结果来看似乎确实有一定的影响,但在realease版本下所花时间几乎相等,也许编译器有优化吧!

C++11中对容器的各种循环遍历的效率比较的更多相关文章

  1. 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 ...

  2. javascript中常见的几种循环遍历

    项目开发中,不管是建立在哪个框架基础上,对数据的处理都是必须的,而处理数据离不开各种遍历循环.javascript中循环遍历有很多种方式,记录下几种常见的js循环遍历. 一.for循环 for循环应该 ...

  3. Java中迭代列表中数据时几种循环写法的效率比较

    Java中经常会用到迭代列表数据的情况,本文针对几种常用的写法进行效率比较.虽然网上已经有了类似的文章,但是对他们的结论并不认同. 常见的实现方法: 1.for循环: for(int i = 0; i ...

  4. js替换数组中的一个对象用for循环遍历

    for(let i=0;i<statusList.length;i++){ if (statusList[i]['tableId'] === tableId) { statusList[i]=d ...

  5. JSP中使用<c:forEach>标签循环遍历元素

    转载:http://blog.csdn.net/hero_cheng/article/details/51924577

  6. 一起学习c++11——c++11中的新增的容器

    c++11新增的容器1:array array最早是在boost中出现:http://www.boost.org/doc/libs/1_61_0/doc/html/array.html 当时的初衷是希 ...

  7. java中Collection容器

    1.容器(Collection)也称为集合, 在java中就是指对象的集合. 容器里存放的都只能是对象. 实际上是存放对象的指针(头部地址): 这里对于八种基本数据类型,在集合中实际存的是对应的包装类 ...

  8. 论C++11 中vector的N种遍历方法

    随着C++11标准的出现,C++标准添加了许多有用的特性,C++代码的写法也有比较多的变化. vector是经常要使用到的std组件,对于vector的遍历,本文罗列了若干种写法. (注:本文中代码为 ...

  9. STL中的容器

    STL中的容器 一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist ...

随机推荐

  1. 关闭会声会影2018提示UEIP.dll找不到指定模块

    最近有一些会声会影2018用户反映在关闭后弹出UEIP.dll错误,不知道该怎么办才好,针对这个问题,小编下面为大家介绍下解决方法. 原因分析 出现这个错误跟会声会影安装路径有中文字符是密切相关的,导 ...

  2. Machine Learning方法总结

    Kmeans——不断松弛(?我的理解)模拟,将点集分成几堆的算法(堆数需要自己定). 局部加权回归(LWR)——非参数学习算法,不用担心自变量幂次选择.(因此当二次欠拟合, 三次过拟合的时候不妨尝试这 ...

  3. ubuntu 设置全局代理

    ubuntu配置shadowsocks全局代理 在mac.window平台下都有shadowsocks客户端,因此这两个平台不叙述太多,现在介绍ubuntu下的配置方法. 1.安装python lin ...

  4. 如何使用HtmlTestRunner让自动化测试报告内容更丰富

    原文出自:http://www.cnblogs.com/tsbc/p/4128150.html 简述 使用selenium webdriver + Python做自动化测试,执行完成后要生成测试报告, ...

  5. “Hello World!”团队第六周的第五次会议

    今天是我们团队“Hello World!”团队第六周召开的第五次会议.博客内容: 一.会议时间 二.会议地点 三.会议成员 四.会议内容 五.todo list 六.会议照片 七.燃尽图 八.代码 一 ...

  6. CS小分队第二阶段冲刺站立会议(5月28日)

    昨日成果:昨天对我们的软件的主界面进行了思考,考虑到许多人建议我们团队添加可以自主增加软件快捷键的功能,我对这一想法的可行性和项目总体策划进行评估分析后,决定正式实施:已经完成从电脑上添加文件在我们的 ...

  7. IDEA + SSH OA 第一天(Hibernate : Mapping (RESOURCE) not found)

    切入主题,看看今天的错误是如何发生的: 首先这是我的项目路径,java 是 Sources Root , resources 是 Resources Root ,放了所需要的配置文件,其中 Hiber ...

  8. DescriptionAttribute Class

    指定属性或事件的描述. [Description("The image associated with the control"),Category("Appearanc ...

  9. SVN版本合并技巧

    公司使用了bug管理系统,项目添加新功能时,建一个主工单,再分成多个子工单,将子工单分给多个程序员来开发. 开发人员完成一部分就提交一部分,多个小功能模块就分多次提交到测试主干,然后用测试主干项目发布 ...

  10. DWZ-JUI+UEditor第二次不显示,UEditor异步加载第二次不显示的解决方案

    使用UEditor-1.4.3中遇到第一次跳转到使用UEditor的界面后,编辑器加载正常,返回后第二次再跳转到这个界面就出现UEditor无法正常加载, 也没百度到答案,看UEditor源码,发现这 ...