Fastest way to compare QVariant with UserType
I'm looking for a very fast way to compare two QVariants that wrap the same user type.
What do you think about the following approaches:
@bool operator==() const(const QVariant &rhs)
if(myData.userType() == qMetaTypeId<MyUserType>())
bool method1 = static_cast<MyUserType>(myData.constData()) == static_cast<const MyUserType>(rhs.myData.constData());
bool method2 = myData.value<MyUserType>() == rhs.myData.value<MyUserType>();
I would think that the first approach is faster, because no deep copy or ctor call is necessary. It is more risky because of the static_cast and kind of a hack though.
I took a look into the Qt implementation of the second method, but as far as I could see, at least once the copy ctor of MyUserType is called.
Well... why don't you try and see? Seems like something to just try out and doing some measurements on.
i would also tend to the second comparison.
But you should add "QVariant::canConvert()":http://qt-project.org/doc/qt-4.8/qvariant.html#canConvert checks before comparing the values.
Thanks for the answers guys.
I took the advice to compare the two approaches by stepping through them. The result is pretty clear.
The first approach first calls QVariant::constData() twice (for each side) and then MyClass::operator==() is called.
The second approach takes several steps, including multiple checks and a ctor call for each side before !!! method 1 is used (with a reinterpret_cast instead of a static_cast though).
I think I'll stick to the first method, because it is faster and the comparing of the MetaTypeIds beforehand should in my case be enough to avoid illegal static_casts.