QT智能指针与std智能指针性能测试


测试思路

产生一个3000万次的迭代,在每次迭代中进行一次指针的创建和传递,用chrono库来记录时间,测试一下不同指针的维护成本

测试环境

qt6.5.3创建的控制台程序

测试结果

根据下表可知,独占式智能指针无论是std的还是qt中的,效率基本和裸指针一样,unique_ptr比QScopedPointer慢,推测是move操作导致的,共享式智能指针效率低,主要是维护内部引用计数导致的

指针类型运行时间(ms)
unique_ptr3954
shared_ptr8346
QScopedPointer3568
QSharedPointer10692
bare pointer3436

测试代码

#include <QCoreApplication>
#include <QDebug>
#include <QSharedPointer>
#include <chrono>

class MyClass
{
public:
    MyClass(int value)
        : value_(value)
    {}

    int getValue() const { return value_; }

private:
    int value_;
};

void func1(QSharedPointer<MyClass> ptr);
void func2(std::shared_ptr<MyClass> ptr);
void func3(MyClass *ptr);
void func4(std::unique_ptr<MyClass> ptr);
void func5(MyClass *ptr);

void testSharedPointer()
{
    auto startTime = std::chrono::high_resolution_clock::now();

    for (int i = 0; i < 30000000; ++i) {
        QSharedPointer<MyClass> ptr(new MyClass(i));

        // 多次参数传递
        func1(ptr);
    }

    auto endTime = std::chrono::high_resolution_clock::now();
    auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime)
                           .count();
    qDebug() << "QSharedPointer elapsed time:" << elapsedTime << "ms";
}

void testStdSharedPointer()
{
    auto startTime = std::chrono::high_resolution_clock::now();

    for (int i = 0; i < 30000000; ++i) {
        std::shared_ptr<MyClass> ptr(new MyClass(i));

        // 多次参数传递
        func2(ptr);
    }

    auto endTime = std::chrono::high_resolution_clock::now();
    auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime)
                           .count();
    qDebug() << "std::shared_ptr elapsed time:" << elapsedTime << "ms";
}

void testQScopedPointer()
{
    auto startTime = std::chrono::high_resolution_clock::now();

    for (int i = 0; i < 30000000; ++i) {
        QScopedPointer<MyClass> ptr(new MyClass(i));

        // 多次参数传递
        func3(ptr.data());
    }

    auto endTime = std::chrono::high_resolution_clock::now();
    auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime)
                           .count();
    qDebug() << "QScopedPointer elapsed time:" << elapsedTime << "ms";
}

void testStdUniquePointer()
{
    auto startTime = std::chrono::high_resolution_clock::now();

    for (int i = 0; i < 30000000; ++i) {
        std::unique_ptr<MyClass> ptr(new MyClass(i));

        // 多次参数传递
        func4(std::move(ptr));
    }

    auto endTime = std::chrono::high_resolution_clock::now();
    auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime)
                           .count();
    qDebug() << "std::unique_ptr elapsed time:" << elapsedTime << "ms";
}

void func1(QSharedPointer<MyClass> ptr)
{
    int value = ptr->getValue();
    Q_UNUSED(value); //消除编译器警告
}

void func2(std::shared_ptr<MyClass> ptr)
{
    int value = ptr->getValue();
    Q_UNUSED(value); //消除编译器警告
}

void func3(MyClass *ptr)
{
    int value = ptr->getValue();
    Q_UNUSED(value); //消除编译器警告
}

void func4(std::unique_ptr<MyClass> ptr)
{
    int value = ptr->getValue();
    Q_UNUSED(value); //消除编译器警告
}

void testBarePointer()
{
    auto startTime = std::chrono::high_resolution_clock::now();

    for (int i = 0; i < 30000000; ++i) {
        MyClass *ptr = new MyClass(i);

        // 多次参数传递
        func5(ptr);
        delete ptr;
    }

    auto endTime = std::chrono::high_resolution_clock::now();
    auto elapsedTime = std::chrono::duration_cast<std::chrono::milliseconds>(endTime - startTime)
                           .count();
    qDebug() << "Bare pointer elapsed time:" << elapsedTime << "ms";
}

void func5(MyClass *ptr)
{
    int value = ptr->getValue();
    Q_UNUSED(value);
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    testSharedPointer();
    testStdSharedPointer();
    testQScopedPointer();
    testStdUniquePointer();
    testBarePointer();

    return a.exec();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值