首页 » 嵌入式笔记 » 正文

QT智能指针与裸指针的性能对比测试

代码是gpt直接生成的,感觉没毛病

#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 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 func1(QSharedPointer<MyClass> ptr) {
    // 参数传递
    func2(ptr);
}

void func2(QSharedPointer<MyClass> ptr) {
    // 参数传递
    func3(ptr);
}

void func3(QSharedPointer<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);

        // 多次参数传递
        func4(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 func4(MyClass* ptr) {
    // 参数传递
    func5(ptr);
}

void func5(MyClass* ptr) {
    // 参数传递
    func6(ptr);
}

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

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

    testSharedPointer();
    testBarePointer();

    return a.exec();
}

在上述示例代码中,我们定义了一个名为 MyClass 的类,它包含一个整型成员变量。然后,我们分别实现了两个函数:testSharedPointer 和 testBarePointer,用于测试 QSharedPointer 指针和裸指针的性能。

在 testSharedPointer 函数中,我们使用 QSharedPointer 来创建 MyClass 对象,并在循环内部重复执行创建对象、传递参数和释放对象的操作。我们还添加了三个名为 func1、func2 和 func3 的函数,用于模拟多次参数传递的过程。

在 testBarePointer 函数中,我们使用裸指针来完成相同的操作,并添加了三个名为 func4、func5 和 func6 的函数,用于模拟多次参数传递的过程。

最后,在 main 函数中依次调用 testSharedPointer 和 testBarePointer 函数,分别输出两种方式的运行时间。注意,由于三次以上的参数传递会增加更多的开销,因此这里的性能比较结果可能会更加明显

附: 最后的运行结果:

QSharedPointer elapsed time: 11699 ms
Bare pointer elapsed time: 3373 ms

裸指针比智能指针快三倍以上.
另外,如果把QSharedPointer换为std::unique_ptr,测试结果为

std::unique_ptr elapsed time: 4750 ms
Bare pointer elapsed time: 3329 ms

std::unique_ptr与祼指针几乎没啥差别。

发表评论