繁体   English   中英

使用 QVector 的性能问题<qpair<qpair<qstring, qstring> , 字符串>> </qpair<qpair<qstring,>

[英]Performance problems using QVector<QPair<QPair<QString, QString>, QString>>

我在使用QVector<QPair<QPair<QString, QString>, QString>>实例时遇到严重的性能问题。

假设我有一个 class EmojiList ,它除了保存这个填充了大约 4000 个表情符号及其各自的简称和类别的向量之外什么都不做:

表情符号.h

#include <QVector>

class EmojiList {
public:
    static const QVector<QPair<QPair<QString, QString>, QString>>& list() {
        static EmojiList list;

        return list.emojiList;
    }

private:
    QVector<QPair<QPair<QString, QString>, QString>> emojiList {
        { { "👩‍👩‍👧‍👧", ":woman_woman_girl_girl:" }, "People & Body" },
        { { "👩‍👩‍👧‍👦", ":woman_woman_girl_boy:" }, "People & Body" },
        { { "👩‍👩‍👦‍👦", ":woman_woman_boy_boy:" }, "People & Body" },
        { { "👨‍👩‍👧‍👧", ":man_woman_girl_girl:" }, "People & Body" },
        { { "👨‍👩‍👧‍👦", ":man_woman_girl_boy:" }, "People & Body" },
        // ... ~ 4000 entries to come
    };

它在其他类中被引用(复制)两次,并在QAbstractListModel子类的构造中直接查询:

emojilistmodel.h

#include "emojilist.h"

class EmojiListModel : public QAbstractTableModel
{
    Q_OBJECT

    // ...

private:
    const QVector<QPair<QPair<QString, QString>, QString>>& _emojiMap { EmojiList::list() };

编译包含emojilist.h的应用程序时,编译大约需要 1:20分钟,没有emojilist.h需要 3.8 秒。

此外,启动应用程序比省略 emojilist.h 时花费的时间要长得多:不包含emojilist.h的启动时间为 4 秒,包含emojilist.h的启动时间emojilist.h 3:40min

我如何在这里优化我的代码以提高性能和速度? 我应该使用与 QVector 不同的QVector还是应该切换到QMap或不同类型的容器?

也许在这种情况下也使用 Singleton 不是一个好主意吗?

非常感谢。

通过将表情符号列表解析外包到.cpp文件中,我设法将编译时间减少到 3 秒:

表情符号.h

#include <QVector>

class EmojiList {
public:

    struct EmojiData {
        EmojiData(const QString& _code, const QString& _shortname, const QString& _category) :
            code(_code),
            shortname(_shortname),
            category(_category)
        {}

        QString code;
        QString shortname;
        QString category;
    };

    static const QVector<EmojiData>& list();

private:
    QVector<EmojiData> emojiList;

    void parseFromFile();
};

表情列表.cpp

#include "emojilist.h"

#include <QFile>
#include <QTextStream>

const QVector<EmojiList::EmojiData>& EmojiList::list()
{
    static EmojiList list;

    if (list.emojiList.isEmpty()) {
        list.parseFromFile();
    }

    return list.emojiList;
}

void EmojiList::parseFromFile()
{
    QFile emojiResource { ":/media/new_emoji.list" };

    if (emojiResource.open(QIODevice::ReadOnly)) {
        QTextStream in { &emojiResource };

        while (!in.atEnd()) {
            QStringList line { in.readLine().split(',') };
            emojiList.append({ line.at(0), line.at(1), line.at(2) });
        }
    }

    emojiResource.close();
}

然后在我的列表 model 中检索它:

表情列表模型.cpp

QVariant EmojiListModel::data(const QModelIndex &index, int role) const
{
    if (_emojiMap.isEmpty() || !index.isValid() || index.row() > _emojiMap.size()) {
        return QVariant();
    }

    switch (role) {
    case EmojiName:
        return _emojiMap.at(index.row()).shortname;
    case Emoji:
        return _emojiMap.at(index.row()).code;
    case EmojiCategory: {
        return _emojiMap.at(index.row()).category;
    }
    default:
        return QVariant();
    }
}

它工作得很好,但是启动仍然需要很长时间(5 分钟以上)。 无论如何,这似乎是一个与 QML 相关的问题,所以我必须为此创建一个额外的问题。

非常感谢大家到目前为止的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM