目录

一、 性能测试

二、 QList与QVector耗时对比分析

三、QList遍历方式对比分析

四、QVector遍历方式对比分析


一、 性能测试

最近使用opengl画点云数据时发现比较卡顿,原因是我使用了QList数据结构,后面改为QVector改善很多,速度提升1倍。

private:QVector<QVector3D> m_pointVector;void PointCloud3dWidget::drawGL()
{drawGrid();drawCoordinates();glBegin(GL_POINTS);foreach (auto vec3d, m_pointVector){glVertex3d(vec3d.x(), vec3d.y(), vec3d.z());}glEnd();
}

为了探寻哪种数据结构、哪种遍历方式最快,我对QList与QVector分别用小数据量,中数据量, 大数据量进行了测试,并且使用了for、foreach、auto、迭代器组合了7种遍历方式做了对比,测试结果如下:

测试代码如下:

void QListTest(QList<QVector3D> &pointList)
{qDebug() << "=======QList<QVector3D>======";QTime ms;ms.start();/* 方式1:foreach , */foreach (QVector3D vec, pointList){int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "foreach ," << ms.elapsed() << "ms";/* 方式2:foreach auto , */ms.restart();foreach (auto vec, pointList){int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "foreach auto ," << ms.elapsed() << "ms";/* 方式3:for ;  ;*/ms.restart();for(int i = 0; i < pointList.size() ; ++i){QVector3D vec = pointList.at(i);int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "for ;" << ms.elapsed() << "ms";/* 方式4:for : */ms.restart();for(QVector3D vec : pointList){int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "for :" << ms.elapsed() << "ms";/* 方式5:for auto : */ms.restart();for(auto vec : pointList){int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "for auto :" << ms.elapsed() << "ms";/* 方式6:for iterator */ms.restart();QList<QVector3D>::iterator iter;for (iter = pointList.begin(); iter != pointList.end(); iter++){int x = (*iter).x();int y = (*iter).y();int z = (*iter).z();}qDebug() << "iterator" << ms.elapsed() << "ms";/* 方式7:for auto iterator  */ms.restart();for (auto iter = pointList.begin(); iter != pointList.end(); iter++){int x = (*iter).x();int y = (*iter).y();int z = (*iter).z();}qDebug() << "iterator auto" << ms.elapsed() << "ms";
}void QVectorTest(QVector<QVector3D> &pointVector)
{qDebug() << "=======QVector<QVector3D>======";QTime ms;ms.start();/* 方式1:foreach , */foreach (QVector3D vec, pointVector){int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "foreach" << ms.elapsed() << "ms";/* 方式2:foreach auto , */ms.restart();foreach (auto vec, pointVector){int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "foreach auto" << ms.elapsed() << "ms";/* 方式3:for ;  ;*/ms.restart();for(int i = 0; i < pointVector.size() ; ++i){QVector3D vec = pointVector.at(i);int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "for ;" << ms.elapsed() << "ms";/* 方式4:for : */ms.restart();for(QVector3D vec : pointVector){int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "for :" << ms.elapsed() << "ms";/* 方式5:for auto : */ms.restart();for(auto vec : pointVector){int x = vec.x();int y = vec.y();int z = vec.z();}qDebug() << "for auto :" << ms.elapsed() << "ms";/* 方式6:for iterator*/ms.restart();QVector<QVector3D>::iterator iter;for (iter = pointVector.begin(); iter != pointVector.end(); iter++){int x = (*iter).x();int y = (*iter).y();int z = (*iter).z();}qDebug() << "iterator" << ms.elapsed() << "ms";/* 方式7:for auto iterator  */ms.restart();for (auto iter = pointVector.begin(); iter != pointVector.end(); iter++){int x = (*iter).x();int y = (*iter).y();int z = (*iter).z();}qDebug() << "iterator auto" << ms.elapsed() << "ms";
}int main()
{QList<QVector3D> pointList;QVector<QVector3D> pointVector;for(int i = 0; i < 300; ++i){for(int j = 0; j < 300; ++j){pointList.append(QVector3D(i, j, i + j));pointVector.append(QVector3D(i, j, i + j));}}QListTest(pointList);QVectorTest(pointVector);return 0;
}

二、 QList与QVector耗时对比分析

大数据量3000*12000个,蓝色线为QList耗时,橙色线为QVector耗时,QList耗时更久

中数据量3000*3000个,蓝色线为QList耗时,橙色线为QVector耗时,QList耗时更久

小数据量300*300个,蓝色线为QList耗时,橙色线为QVector耗时,QList耗时更久

 结论1:从图中可以发现,QList的不同数据量遍历都比较慢,耗时超QVector一倍。

三、QList遍历方式对比分析

蓝色线为大数据量曲线,橙色为中数据量曲线,灰色为小数据量

 结论2:从图中可以发现,QList小数据量时7种遍历时间差不多,但是大数据量时迭代器遍历方式耗时最久,for(:)最快。

四、QVector遍历方式对比分析

蓝色线为大数据量曲线,橙色为中数据量曲线,灰色为小数据量

结论3:从图中可以发现,QVector小数据量时7种遍历时间差不多,但是大数量时迭代器遍历方式耗时最久,for(auto :)最快。与QList结论基本一致。

QList与QVector遍历方法与性能比较相关推荐

  1. Java-Map从入门到性能分析1【Map初识、Map通用方法、HashMap的使用(遍历方法、性能分析)】

    [视频网址]:慕课网--Map从入门到性能分析 简介:Map是开发中,使用频率最高的知识点之一,Map家族也有很多成员,例如HashMap,LinkedMap等, 怎样更好地使用Map家族的这些成员, ...

  2. Java list三种遍历方法性能比较

    从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象 ...

  3. java 遍历list 性能_java list三种遍历方法性能比較

    从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便測试各种遍历方法的性能,測试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象 ...

  4. HashMap 的 7 种遍历方式与性能分析!(强烈推荐)

    来自:Java中文社群 随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历 ...

  5. java list三种遍历方法性能比較

    从c/c++语言转向java开发,学习java语言list遍历的三种方法,顺便測试各种遍历方法的性能,測试方法为在ArrayList中插入1千万条记录,然后遍历ArrayList,发现了一个奇怪的现象 ...

  6. HashMap 的 7 种遍历方式与性能分析!

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  7. iterator遍历_HashMap 的 7 种遍历方式与性能分析!(强烈推荐)

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  8. JS几种数组遍历方式以及性能分析对比

    前言 这一篇与上一篇 JS几种变量交换方式以及性能分析对比 属于同一个系列,本文继续分析JS中几种常用的数组遍历方式以及各自的性能对比 起由 在上一次分析了JS几种常用变量交换方式以及各自性能后,觉得 ...

  9. ES5和ES6数组遍历方法详解

    ES5和ES6数组遍历方法详解 在ES5中常用的10种数组遍历方法: 1.原始的for循环语句 2.Array.prototype.forEach数组对象内置方法 3.Array.prototype. ...

最新文章

  1. Go 分布式学习利器(14)-- Go语言的错误处理
  2. ios时间差,以时间格式显示
  3. VNC下安装Oracle报错--Could not execute auto check for display colors
  4. 读入源文件,并在每行前加上行号和[Tab]
  5. SQL 学习笔记一 入门
  6. 在windows下安装配置Ulipad
  7. 移位运算符优先级很低
  8. 顺势而为,戴尔加速流动文件系统进化
  9. 使用 IBM Rational System Architect 工作区来实施 DoDAF 2 架构
  10. 为什么局域网需要https加密?如何选择内网SSL证书?
  11. CSS基础——简单的文字样式
  12. 用Django2.1开发易班联合登录
  13. 传统图像特征提取方法列表
  14. RAID介绍及RAID5配置实例(超详细)
  15. 网络基本知识【数据传输流程】
  16. 微软账户服务器连不上开不了机,Win10无法登录微软账户提示“内部服务器错误(500)”怎么解决?...
  17. Linux进程间通信(下)
  18. 自己收集整理的微软错误代码大全(中文和英文)
  19. CSS 2D转换和源点的影响原理(translate、scale、skew、rotate)
  20. 客户端与服务器信息交互的流程,客户端与服务器的交互流程

热门文章

  1. 微信公众平台之CURL应用
  2. 苹果站台“下一代高清通话”?都是套路!
  3. 如何在笔记本电脑上打出特殊符号?(针对win10版本)
  4. 记一次实习面试失败的经历(大数据)
  5. 写代码神器!笔记本追剧办公贼爽,包邮送一台!
  6. DataWorks数据集成任务切分键妙用
  7. pubg服务器维护请稍后再试9月4日,《绝地求生》PUBG9月4日更新公告 绝地求生9月4日维护到几点?...
  8. 10个爬虫工程师必备的工具了解一哈
  9. What is Logo?
  10. 教师回应儿童问题及对策研究