QList与QVector遍历方法与性能比较

news2024/11/15 21:56:58

 

目录

 

一、 性能测试

二、 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结论基本一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是数学思维

什么是数学 数学 [英语&#xff1a;mathematics&#xff0c;源自古希腊语μάθημα&#xff08;mthēma&#xff09;&#xff1b;经常被缩写为math或maths]&#xff0c;是研究数量、结构、变化、空间以及信息等概念的一门学科。 数学 是人类对事物的抽象结构与模式进行严格…

大学生影视主题网页制作 HTML+CSS+JS仿360影视网站 dreamweaver电影HTML网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

数据结构:排序

目录 插入排序 插入排序 希尔排序 选择排序 选择排序 堆排序 交换排序 冒泡排序 快速排序 递归实现&#xff1a; ●hoare版本 ●三数取中小区间法优化 ●挖坑版本 ●双指针版本 非递归 ●用栈实现 ●用队列实现 归并排序 ● 递归 ●非递归 总结 来了朋友&a…

slot的理解

首先&#xff0c;大概了解一下插槽&#xff1a; 插槽是什么 ![在这里插入图片描述](https://img-blog.csdnimg.cn/90b04660769e49c286ee2e1821d2a2bb.png 插槽&#xff1a;在HTML中 slot 元素 &#xff0c;作为 Web Components 技术套件的一部分&#xff0c;是Web组件内的一个占…

HashMap1.8也会发生死循环

在网上搜资料时候然后发现网上都说1.7版本的HashMap会发生死链也就是死循环&#xff0c;但是在HashMap中也会产生死循环&#xff0c;接下来直接看代码吧 代码 类名字我忘记改了这是我以前看park时候弄的但是这不重要 当你运行 public class parkAndUnpark {static Map<…

微服务守护神-Sentinel-降级规则

引言 书接上篇 微服务守护神-Sentinel-流控规则 &#xff0c;上面介绍了Sentinel流控规则&#xff0c;本篇继续来Sentinel的降级规则。 降级规则 那啥为降级呢&#xff1f;降级可以理解为下降等次&#xff0c;比如&#xff1a;你从广州到北京&#xff0c;有钱时&#xff0c;…

Kafka的认证

Kafka支持基于SSL和基于SASL的安全认证机制。 基于SSL的认证主要是指Broker和客户端的双路认证。即客户端认证broker的证书&#xff0c;broker也认证客户端的证书。 Kafka还支持通过SASL做客户端认证。SASL是提供认证和数据安全服务的框架。Kafka支持的SASL机制有5种&#xff…

Docker容器化技术入门(一)Docker简介

Docker容器化技术入门&#xff08;一&#xff09;Docker简介前言&#xff08;一&#xff09;Docker简介1 Docker是什么&#xff1f;1.1 Docker的出现1.2 Docker的理念1.3 一句话2 容器与虚拟机比较2.1 容器发展简史2.2 传统虚拟机技术2.3 容器虚拟化技术2.4 对比3 Docker能干什…

华硕编程竞赛11月JAVA专场 D题飞机大战 题解

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

org.eclipse.e4.core.di.InjectionException: Unable to proces

eclipse RCP 项目在eclipse 插件程序中正常运行&#xff0c;导出eclipse product后运行报错。路径&#xff1a;【项目名称】–>workspace–>.metadata–>.log 报错信息如下&#xff1a; !SESSION 2022-12-08 17:19:22.227 ------------------------------------------…

MATLAB、R用改进Fuzzy C-means模糊C均值聚类算法的微博用户特征调研数据聚类研究...

全文链接&#xff1a;http://tecdat.cn/?p30766本文就将采用改进Fuzzy C-means算法对基于用户特征的微博数据进行聚类分析。去年&#xff0c;我们为一位客户进行了短暂的咨询工作&#xff0c;他正在构建一个主要基于微博用户特征聚类研究的分析应用程序&#xff08;点击文末“…

从零开始带你实现一套自己的CI/CD(二)Jenkins+Sonar Qube

目录一、简介二、Sonar环境搭建2.1 下载Docker镜像2.2 使用docker-compose部署三、Sonar Qube基本使用3.1 Maven实现代码检测3.2 Sonar-scanner实现代码检测四、Jenkins集成Sonar Qube4.1 下载插件4.2 SonarQube生成Token4.3 Jenkins配置Sonar Token信息4.4 Jenkins全局工具配置…

word如何设置页码?一分钟教你设置Word文档的页码!

你知道Word怎么设置页码吗&#xff1f;可能你还找不到页码在何处。相信有很多人也会遇到这些类似的问题。如何在Word文档里面的任意一页设置页码呢&#xff1f;word如何设置页码&#xff1f;现在小编就把设置页码的过程和截图分享出来&#xff0c;本文仅供参考使用。有需要的朋…

算法刷题打卡第40天:打家劫舍

打家劫舍 难度&#xff1a;中等 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。…

全解一款六面体结构化网格划分利器-NUMECA IGG

作者 |卢工FunRun 仿真秀优秀讲师 导读&#xff1a;前不久&#xff0c;VIP群有人提问&#xff1a;“老师&#xff0c;NUMECA如何计算带蜗壳叶轮机呢”&#xff1f;笔者使用NUMECA FINE/Turbo&#xff08;以下简称Turbo&#xff09;软件解决叶轮机械气动性能仿真计算已有三年多&…

nRF Connect的使用

一、工具简介 nRF Connect是NORDIC开发的一款低功耗蓝牙测试APP&#xff0c;仅支持安卓。可以扫描和探索低功耗蓝牙设备并与它们通信。 蓝牙通信的核心是向硬件发送数据和接收硬件传回来的数据。 二、准备项 Android手机 蓝牙硬件 三、使用简介 1、进入界面 &#xff08;1&…

某科技公司防火墙配置与管理

目录 杭州继保南瑞电子科技有限公司… 1 公司简介…2需求分析… 错误!未定义书签。公司网络拓扑图…4IP 地址规划 …4设备选型…5技术介绍…6 6.1 DMZ …6 6.2 VPN …6 6.3 NAT …6 6.4 ACL …7项目实施…7 7.1 DMZ 区域配置及结果测试 …7 7.1.1 防火墙基本配置…8 7.1.2 内网…

粉笔通过上市聆讯:上半年营收14.5亿 腾讯经纬高瓴是股东

雷递网 雷建平 12月7日职业教育平台粉笔科技今日通过聆讯&#xff0c;准备在港交所上市。花旗、中金&#xff08;香港&#xff09;和美银证券为其联席保荐人。粉笔科技此次募资用途为丰富课程内容、扩大学员群体、加强内容及技术开发能力等。上半年营收14.51亿粉笔科技成立于20…

# spring-security(一)

一、权限管理简介 1、什么是权限管理 基本上涉及到用户参与的系统都要进行权限管理&#xff0c;权限管理属于系统安全的范畴&#xff0c;权限管理实现对用户访问系统的控制&#xff0c;按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。 ​ 权限管理…

学习笔记-3-SVM-9-Twin SVM

Outline 1. Motivation 2. Geometry 3. Algebraic manipulation 4. Observations ------------------------------ 1. Motivation Twin SVM的基本出发点是做二分类时&#xff0c;为什么我们只用1个分割超平面&#xff0c;为什么不能用两个呢&#xff1f; 这里是想用两个…