[Development] Container refactor update [Caution: Message contains Suspicious URL content]

Mülner, Helmut helmut.muelner at joanneum.at
Thu Jun 21 09:56:39 CEST 2012


> Von: development-bounces+helmut.muelner=joanneum.at at qt-project.org
> [mailto:development-bounces+helmut.muelner=joanneum.at at qt-
> project.org] Im Auftrag von André Pönitz
> Gesendet: Donnerstag, 21. Juni 2012 02:00
> An: Marc Mutz
> Cc: development at qt-project.org
> Betreff: Re: [Development] Container refactor update [Caution: Message
> contains Suspicious URL content]
> 
> On Thu, Jun 21, 2012 at 01:06:16AM +0200, Marc Mutz wrote:
> > On Thursday June 21 2012, André Pönitz wrote:
> > > On Wed, Jun 20, 2012 at 08:52:55AM +0200, Marc Mutz wrote:

> [...]
> 
> #include <QList>
> #include <QVector>
> #include <math.h>
> 
> struct A
> {
>     A() : a(sin(12)) {}
>     A(const A &b) : a(sin(b.a) + cos(b.a)) {}
>     int a;
> };
> 
> struct Foo
> {
>     A a[100];
> };
> 
> int list()
> {
>     QList<Foo> f;
>     for (int i = 0; i != 10000; ++i)
>         f.append(Foo());
>     return f.size();
> }
> 
> int vector()
> {
>     QVector<Foo> f;
>     for (int i = 0; i != 10000; ++i)
>         f.append(Foo());
>     return f.size();
> }
> 
> int main()
> {
>     return list() + vector();
> }
> 
> callgrind just came up with a 3:1 advantage _in favour_ of QList.
> 
> And that ratio can be made look arbitrarily worse by adding more load to the
> copy constructor.
> [...]

I measured this programming using MSVC2010 with /Ox and Rational Quantify and also the a 3:1 factor.
But: QList::append calls new 10000 times, QVector::append never calls new but QVectorData::allocate twice and QVector::realloc once.
If I add f.reserve(10000) in both cases, QList::append still call new 10000 times, and QVectorData::allocate is still called only twice, and QVector is faster than QList (by a small but consistent margin).
Without optimization QVectorData::allocate is call 24 times (for the first case, still 3:1).

This looks like MSVC2010 can optimize away QVector resizes. And you can get arbitrary results if you make the constructor heavier and the copy constructor lighter.

Best regards,
Helmut





More information about the Development mailing list