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