> Von: [email protected]
> [mailto:development-bounces+helmut.muelner=joanneum.at@qt-
> project.org] Im Auftrag von André Pönitz
> Gesendet: Donnerstag, 21. Juni 2012 02:00
> An: Marc Mutz
> Cc: [email protected]
> 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
_______________________________________________
Development mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/development