当前位置: 首页 > article >正文

深入浅出Qt容器类:QList、QMap、QHash等常用容器性能对比测试

深入浅出Qt容器类:QList、QMap、QHash等常用容器对比分析


上一篇对比了各个使用场景和特点,为了更好地理解不同容器的性能差异,通过一些常见的操作来比较它们的表现。以下是一些基本操作的时间复杂度:

操作QList<T>QVector<T>QLinkedList<T>QSet<T>QMap<Key, T>QMultiMap<Key, T>QHash<Key, T>QMultiHash<Key, T>QStack<T>QQueue<T>
访问O(1)O(1)O(n)N/AO(log n)O(log n)N/AN/AO(1)O(1)
插入(头部)O(n)O(n)O(1)O(1)O(log n)O(log n)O(1)O(1)O(n)O(n)
插入(尾部)O(1)O(1)O(1)O(1)O(log n)O(log n)O(1)O(1)O(1)O(1)
删除(头部)O(n)O(n)O(1)O(1)O(log n)O(log n)O(1)O(1)O(n)O(n)
删除(尾部)O(1)O(1)O(1)O(1)O(log n)O(log n)O(1)O(1)O(1)O(1)
查找O(n)O(n)O(n)O(1)O(log n)O(log n)O(1)O(1)O(n)O(n)

性能测试案例

下面是一个简单的性能测试示例,展示了不同容器在插入大量元素时的表现。这个测试程序会测量每个容器在插入20000,000个整数和查询所需的时间。

#include <QList>
#include <QVector>
#include <QLinkedList>
#include <QSet>
#include <QMap>
#include <QMultiMap>
#include <QHash>
#include <QMultiHash>
#include <QStack>
#include <QQueue>
#include <QElapsedTimer>
#include <QDebug>

template<typename Container>
void testContainerInsertionAndLookup(const QString& containerName, void (*insertFunction)(Container&, int), bool (*lookupFunction)(const Container&, int)) {
    Container data;
    QElapsedTimer timer;

    // 测试插入操作
    timer.start();
    for (int i = 0; i < 20000000; ++i) {
        insertFunction(data, i);
    }
    qint64 insertionTime = timer.elapsed();

    // 测试查找操作
    timer.restart();
    lookupFunction(data, 5000000);
    qint64 lookupTime = timer.elapsed();

    qDebug() << containerName << "Insert Time:" << insertionTime << "ms."<< "Lookup Time:" << lookupTime << "ms";
}

void insertIntoQList(QList<int>& list, int value) {
    list.append(value);
}

bool lookupInQList(const QList<int>& list, int value) {
    return list.contains(value);
}

void insertIntoQVector(QVector<int>& vector, int value) {
    vector.append(value);
}

bool lookupInQVector(const QVector<int>& vector, int value) {
    return vector.contains(value);
}

void insertIntoQLinkedList(QLinkedList<int>& linkedList, int value) {
    linkedList.append(value);
}

bool lookupInQLinkedList(const QLinkedList<int>& linkedList, int value) {
    return linkedList.contains(value);
}

void insertIntoQSet(QSet<int>& set, int value) {
    set.insert(value);
}

bool lookupInQSet(const QSet<int>& set, int value) {
    return set.contains(value);
}

void insertIntoQMap(QMap<int, int>& map, int value) {
    map[value] = value;
}

bool lookupInQMap(const QMap<int, int>& map, int value) {
    return map.contains(value);
}

void insertIntoQMultiMap(QMultiMap<int, int>& multiMap, int value) {
    multiMap.insert(value, value);
}

bool lookupInQMultiMap(const QMultiMap<int, int>& multiMap, int value) {
    return multiMap.contains(value);
}

void insertIntoQHash(QHash<int, int>& hash, int value) {
    hash[value] = value;
}

bool lookupInQHash(const QHash<int, int>& hash, int value) {
    return hash.contains(value);
}

void insertIntoQMultiHash(QMultiHash<int, int>& multiHash, int value) {
    multiHash.insert(value, value);
}

bool lookupInQMultiHash(const QMultiHash<int, int>& multiHash, int value) {
    return multiHash.contains(value);
}

void insertIntoQStack(QStack<int>& stack, int value) {
    stack.push(value);
}

bool lookupInQStack(const QStack<int>& stack, int value) {
    return stack.contains(value);
}

void insertIntoQQueue(QQueue<int>& queue, int value) {
    queue.enqueue(value);
}

bool lookupInQQueue(const QQueue<int>& queue, int value) {
    return queue.contains(value);
}

int main() {
    testContainerInsertionAndLookup("QList", insertIntoQList, lookupInQList);
    testContainerInsertionAndLookup("QVector", insertIntoQVector, lookupInQVector);
    testContainerInsertionAndLookup("QLinkedList", insertIntoQLinkedList, lookupInQLinkedList);
    testContainerInsertionAndLookup("QSet", insertIntoQSet, lookupInQSet);
    testContainerInsertionAndLookup("QMap", insertIntoQMap, lookupInQMap);
    testContainerInsertionAndLookup("QMultiMap", insertIntoQMultiMap, lookupInQMultiMap);
    testContainerInsertionAndLookup("QHash", insertIntoQHash, lookupInQHash);
    testContainerInsertionAndLookup("QMultiHash", insertIntoQMultiHash, lookupInQMultiHash);
    testContainerInsertionAndLookup("QStack", insertIntoQStack, lookupInQStack);
    testContainerInsertionAndLookup("QQueue", insertIntoQQueue, lookupInQQueue);

    return 0;
}

测试结果(X86,Qt5.14)

在这里插入图片描述
以上是我的测试结果,仅供参考,若有疑问欢迎在评论区讨论。


http://www.kler.cn/a/594847.html

相关文章:

  • 鸿蒙保姆级教学
  • Bigemap Pro 的三种地图下载方式
  • Elasticsearch Sql 查询
  • 尚硅谷爬虫(解析_xpath的基本使用)笔记
  • 大模型的应用与微调:如何调用 LLM?从 OpenAI API 到本地部署
  • Linux 安全与存储管理指南
  • 腾讯云大模型知识引擎×DeepSeek:股票分析低代码应用实践
  • let const var 底层区域别,es6还有AO 对象和GO对象吗
  • rust学习笔记17-异常处理
  • Redis 管道(Pipeline)深度解析:原理、场景与实战
  • 多包管理工具
  • 删除菜品接口
  • 软考高级信息系统管理工程师通关100题(21-40)附记忆口诀
  • 支持向量机SVM的MATLAB分类预测实现
  • 华为IPD研发管理体系的3大核心框架解析
  • HOW - 平时如何保持学习和成长?
  • vscode/windsurf/trae无法识别junit的@Test注解解决办法
  • 如何在 C++ 中运行 DeepSeek R1 LLM
  • AES 简介 以及 C# 和 js 实现【加密知多少系列_3】
  • 用PaddleNLP为GPT-2模型制作FineWeb二进制预训练数据集