From 37b0bad8adb4547885e086848792d81e4e3f076f Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Tue, 26 Jan 2021 09:27:24 +0100 Subject: QVariant: avoid superfluous QMetaType lookup Constructing a QMetaType from an id requires a lookup which isn't free, even for builtin types. When constructing a QVariant from an integer, this leads to a noticeable performance loss. In the mirco-benchmark of the linked bug, we improve from 100000000 965 to 100000000 789 on Linux, Intel i5-4690, clang 11.01 with a CMake release build. This however still does not recover the performance we had in Qt 5. Task-number: QTBUG-90560 Change-Id: I26440bdc04ef131ce91d3698957f0df43a4c4017 Reviewed-by: Lars Knoll Reviewed-by: Andrei Golubev --- src/corelib/kernel/qvariant.cpp | 76 ++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index 0f92307d8c..c2ae5fb1dc 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -793,131 +793,131 @@ QVariant::QVariant(QMetaType type, const void *copy) : d(type) } QVariant::QVariant(int val) - : d(QMetaType::Int) + : d(QMetaType::fromType()) { d.set(val); } QVariant::QVariant(uint val) - : d(QMetaType::UInt) + : d(QMetaType::fromType()) { d.set(val); } QVariant::QVariant(qlonglong val) - : d(QMetaType::LongLong) + : d(QMetaType::fromType()) { d.set(val); } QVariant::QVariant(qulonglong val) - : d(QMetaType::ULongLong) + : d(QMetaType::fromType()) { d.set(val); } QVariant::QVariant(bool val) - : d(QMetaType::Bool) + : d(QMetaType::fromType()) { d.set(val); } QVariant::QVariant(double val) - : d(QMetaType::Double) + : d(QMetaType::fromType()) { d.set(val); } QVariant::QVariant(float val) - : d(QMetaType::Float) + : d(QMetaType::fromType()) { d.set(val); } QVariant::QVariant(const QByteArray &val) - : d(QMetaType::QByteArray) + : d(QMetaType::fromType()) { v_construct(&d, val); } QVariant::QVariant(const QBitArray &val) - : d(QMetaType::QBitArray) + : d(QMetaType::fromType()) { v_construct(&d, val); } QVariant::QVariant(const QString &val) - : d(QMetaType::QString) + : d(QMetaType::fromType()) { v_construct(&d, val); } QVariant::QVariant(QChar val) - : d(QMetaType::QChar) + : d(QMetaType::fromType()) { v_construct(&d, val); } QVariant::QVariant(QLatin1String val) - : d(QMetaType::QString) + : d(QMetaType::fromType()) { v_construct(&d, val); } QVariant::QVariant(const QStringList &val) - : d(QMetaType::QStringList) + : d(QMetaType::fromType()) { v_construct(&d, val); } QVariant::QVariant(QDate val) - : d(QMetaType::QDate) + : d(QMetaType::fromType()) { v_construct(&d, val); } QVariant::QVariant(QTime val) - : d(QMetaType::QTime) + : d(QMetaType::fromType()) { v_construct(&d, val); } QVariant::QVariant(const QDateTime &val) - : d(QMetaType::QDateTime) + : d(QMetaType::fromType()) { v_construct(&d, val); } #if QT_CONFIG(easingcurve) QVariant::QVariant(const QEasingCurve &val) - : d(QMetaType::QEasingCurve) + : d(QMetaType::fromType()) { v_construct(&d, val); } #endif QVariant::QVariant(const QList &list) - : d(QMetaType::QVariantList) + : d(QMetaType::fromType>()) { v_construct(&d, list); } QVariant::QVariant(const QMap &map) - : d(QMetaType::QVariantMap) + : d(QMetaType::fromType>()) { v_construct(&d, map); } QVariant::QVariant(const QHash &hash) - : d(QMetaType::QVariantHash) + : d(QMetaType::fromType>()) { v_construct(&d, hash); } #ifndef QT_NO_GEOM_VARIANT QVariant::QVariant(const QPoint &pt) - : d(QMetaType::QPoint) + : d(QMetaType::fromType()) { v_construct(&d, pt); } QVariant::QVariant(const QPointF &pt) - : d(QMetaType::QPointF) + : d(QMetaType::fromType()) { v_construct(&d, pt); } QVariant::QVariant(const QRectF &r) - : d(QMetaType::QRectF) + : d(QMetaType::fromType()) { v_construct(&d, r); } QVariant::QVariant(const QLineF &l) - : d(QMetaType::QLineF) + : d(QMetaType::fromType()) { v_construct(&d, l); } QVariant::QVariant(const QLine &l) - : d(QMetaType::QLine) + : d(QMetaType::fromType()) { v_construct(&d, l); } QVariant::QVariant(const QRect &r) - : d(QMetaType::QRect) + : d(QMetaType::fromType()) { v_construct(&d, r); } QVariant::QVariant(const QSize &s) - : d(QMetaType::QSize) + : d(QMetaType::fromType()) { v_construct(&d, s); } QVariant::QVariant(const QSizeF &s) - : d(QMetaType::QSizeF) + : d(QMetaType::fromType()) { v_construct(&d, s); } #endif #ifndef QT_BOOTSTRAPPED QVariant::QVariant(const QUrl &u) - : d(QMetaType::QUrl) + : d(QMetaType::fromType()) { v_construct(&d, u); } #endif QVariant::QVariant(const QLocale &l) - : d(QMetaType::QLocale) + : d(QMetaType::fromType()) { v_construct(&d, l); } #if QT_CONFIG(regularexpression) QVariant::QVariant(const QRegularExpression &re) - : d(QMetaType::QRegularExpression) + : d(QMetaType::fromType()) { v_construct(&d, re); } #endif // QT_CONFIG(regularexpression) QVariant::QVariant(const QUuid &uuid) - : d(QMetaType::QUuid) + : d(QMetaType::fromType()) { v_construct(&d, uuid); } #ifndef QT_BOOTSTRAPPED QVariant::QVariant(const QJsonValue &jsonValue) - : d(QMetaType::QJsonValue) + : d(QMetaType::fromType()) { v_construct(&d, jsonValue); } QVariant::QVariant(const QJsonObject &jsonObject) - : d(QMetaType::QJsonObject) + : d(QMetaType::fromType()) { v_construct(&d, jsonObject); } QVariant::QVariant(const QJsonArray &jsonArray) - : d(QMetaType::QJsonArray) + : d(QMetaType::fromType()) { v_construct(&d, jsonArray); } QVariant::QVariant(const QJsonDocument &jsonDocument) - : d(QMetaType::QJsonDocument) + : d(QMetaType::fromType()) { v_construct(&d, jsonDocument); } #endif // QT_BOOTSTRAPPED #if QT_CONFIG(itemmodel) QVariant::QVariant(const QModelIndex &modelIndex) - : d(QMetaType::QModelIndex) + : d(QMetaType::fromType()) { v_construct(&d, modelIndex); } QVariant::QVariant(const QPersistentModelIndex &modelIndex) - : d(QMetaType::QPersistentModelIndex) + : d(QMetaType::fromType()) { v_construct(&d, modelIndex); } #endif -- cgit v1.2.3