From c733429f4fa9696fb027ddc946e54f6bbb68deaf Mon Sep 17 00:00:00 2001 From: Milian Wolff Date: Wed, 10 Dec 2014 21:16:45 +0100 Subject: [PATCH 30/30] Preallocate a capacity of 16 for the returned list. See also 159abaf2f372eaa633db8f69ff6b1edd459998cc in kdepimlibs on why. I'll quote it here again: In my data, most often the final size of fetchResponse is 16. By reserving that data upfront, we can get rid of 3/4 of the list allocations, according to the growth-strategy outlined here: http://qt-project.org/doc/qt-4.8/containers.html#growth-strategies I.e. before, we'd allocate 4, 8, 12, 16. Now we directly allocate room for 16. Thing is, doing this outside of akonadi has no effect, as QList::clear destroys the internal buffer. With the added benchmark, I now verified that this patch here does have a positive effect. --- libs/imapparser.cpp | 2 ++ libs/tests/imapparserbenchmark.cpp | 52 ++++++++++++++++++++++++++------------ 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/libs/imapparser.cpp b/libs/imapparser.cpp index f3301e7..f5a7457 100644 --- a/libs/imapparser.cpp +++ b/libs/imapparser.cpp @@ -79,6 +79,8 @@ int parseParenthesizedListHelper( const QByteArray &data, T &result, int start ) return start; } + result.reserve(16); + int count = 0; int sublistBegin = start; bool insideQuote = false; diff --git a/libs/tests/imapparserbenchmark.cpp b/libs/tests/imapparserbenchmark.cpp index ee861a0..7545238 100644 --- a/libs/tests/imapparserbenchmark.cpp +++ b/libs/tests/imapparserbenchmark.cpp @@ -27,6 +27,25 @@ Q_DECLARE_METATYPE( QList ) class ImapParserBenchmark : public QObject { Q_OBJECT + private: + void geneateParseParenthesizedListData() + { + QTest::addColumn( "data" ); + QTest::newRow( "empty" ) << QByteArray(); + QTest::newRow( "unnested" ) << QByteArray("(\"Foo Bar\" NIL \"foobar\" \"test.com\")"); + QTest::newRow( "nested" ) << QByteArray("((\"Foo Bar\" NIL \"foobar\" \"test.com\"))"); + QTest::newRow( "nested-long" ) << QByteArray("(UID 86 REV 0 MIMETYPE \"message/rfc822\" COLLECTIONID 13 SIZE 6114 FLAGS (\\SEEN)" + " ANCESTORS ((13 \"/INBOX\") (12 \"imap://mail@mail.test.com/\") (0 \"\")) PLD:ENVELOPE[1] {396}" + " (\"Fri, 04 Jun 2010 09:07:54 +0200\" \"Re: [ADMIN] foobar available again!\"" + " ((\"Foo Bar\" NIL \"foobar\" \"test.com\"))" + " NIL NIL" + " ((\"Asdf Bla Blub\" NIL \"asdf.bla.blub\" \"123test.org\"))" + " ((NIL NIL \"muh.kuh\" \"lalala.com\") (\"Konqi KDE\" NIL \"konqi\" \"kde.org\") (NIL NIL \"all\" \"test.com\"))" + " NIL \"<201006040905.33367.foo.bar@test.com>\" \"<4C08A64A.9020205@123test.org>\"" + " \"<201006040142.56540.muh.kuh@lalala.com> <201006040704.39648.konqi@kde.org> <201006040905.33367.foo.bar@test.com>\"" + "))"); + } + private Q_SLOTS: void quote_data() { @@ -68,25 +87,12 @@ class ImapParserBenchmark : public QObject } } - void parseParenthesizedList_data() + void parseParenthesizedQVarLengthArray_data() { - QTest::addColumn( "data" ); - QTest::newRow( "empty" ) << QByteArray(); - QTest::newRow( "unnested" ) << QByteArray("(\"Foo Bar\" NIL \"foobar\" \"test.com\")"); - QTest::newRow( "nested" ) << QByteArray("((\"Foo Bar\" NIL \"foobar\" \"test.com\"))"); - QTest::newRow( "nested-long" ) << QByteArray("(UID 86 REV 0 MIMETYPE \"message/rfc822\" COLLECTIONID 13 SIZE 6114 FLAGS (\\SEEN)" - " ANCESTORS ((13 \"/INBOX\") (12 \"imap://mail@mail.test.com/\") (0 \"\")) PLD:ENVELOPE[1] {396}" - " (\"Fri, 04 Jun 2010 09:07:54 +0200\" \"Re: [ADMIN] foobar available again!\"" - " ((\"Foo Bar\" NIL \"foobar\" \"test.com\"))" - " NIL NIL" - " ((\"Asdf Bla Blub\" NIL \"asdf.bla.blub\" \"123test.org\"))" - " ((NIL NIL \"muh.kuh\" \"lalala.com\") (\"Konqi KDE\" NIL \"konqi\" \"kde.org\") (NIL NIL \"all\" \"test.com\"))" - " NIL \"<201006040905.33367.foo.bar@test.com>\" \"<4C08A64A.9020205@123test.org>\"" - " \"<201006040142.56540.muh.kuh@lalala.com> <201006040704.39648.konqi@kde.org> <201006040905.33367.foo.bar@test.com>\"" - "))"); + geneateParseParenthesizedListData(); } - void parseParenthesizedList() + void parseParenthesizedQVarLengthArray() { QFETCH( QByteArray, data ); QVarLengthArray result; @@ -95,6 +101,20 @@ class ImapParserBenchmark : public QObject } } + void parseParenthesizedQList_data() + { + geneateParseParenthesizedListData(); + } + + void parseParenthesizedQList() + { + QFETCH( QByteArray, data ); + QList result; + QBENCHMARK { + ImapParser::parseParenthesizedList( data, result, 0 ); + } + } + void parseString_data() { QTest::addColumn( "data" ); -- 2.1.0