From ca26fefc0624264262a2abe630568271cefa2753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Nowacki?= Date: Mon, 31 Oct 2011 10:22:46 +0100 Subject: [optimization] QVariants comparison QMetaType::isRegistered and QMetaType::typeName are quite expensive. To compare two custom objects we need to have their type name (for dereferenced comparison). If the name exist we know for sure that the type is registered and we do not have to call QMetaType::isRegistered anymore. Change-Id: Iba631e012504c8633868a902880fa30d38afb917 Reviewed-by: Olivier Goffart --- src/corelib/kernel/qvariant_p.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/corelib/kernel/qvariant_p.h b/src/corelib/kernel/qvariant_p.h index aa03bb298a..5729c0d2d5 100644 --- a/src/corelib/kernel/qvariant_p.h +++ b/src/corelib/kernel/qvariant_p.h @@ -161,13 +161,13 @@ class QVariantComparator { struct FilteredComparator { static bool compare(const QVariant::Private *m_a, const QVariant::Private *m_b) { - if (!QMetaType::isRegistered(m_a->type)) + const char *const typeName = QMetaType::typeName(m_a->type); + if (Q_UNLIKELY(!typeName) && Q_LIKELY(!QMetaType::isRegistered(m_a->type))) qFatal("QVariant::compare: type %d unknown to QVariant.", m_a->type); const void *a_ptr = m_a->is_shared ? m_a->data.shared->ptr : &(m_a->data.ptr); const void *b_ptr = m_b->is_shared ? m_b->data.shared->ptr : &(m_b->data.ptr); - const char *const typeName = QMetaType::typeName(m_a->type); uint typeNameLen = qstrlen(typeName); if (typeNameLen > 0 && typeName[typeNameLen - 1] == '*') return *static_cast(a_ptr) == *static_cast(b_ptr); -- cgit v1.2.3