Rex Dieter adf30a
From 89357c7b0fc5e76091510af504058c036fa1b2f9 Mon Sep 17 00:00:00 2001
Rex Dieter adf30a
From: Milian Wolff <mail@milianw.de>
Rex Dieter adf30a
Date: Wed, 10 Dec 2014 21:04:24 +0100
Rex Dieter adf30a
Subject: [PATCH 29/30] Reduce the amount of allocations by preallocating a
Rex Dieter adf30a
 buffer.
Rex Dieter adf30a
Rex Dieter adf30a
Sadly, QByteArray cannot be cleared without destroying the buffer.
Rex Dieter adf30a
But we can guesstimate the target size of the buffer and thus
Rex Dieter adf30a
reduce the amount of allocations.
Rex Dieter adf30a
Rex Dieter adf30a
This also adds a benchmark for ImapParser::parseString.
Rex Dieter adf30a
---
Rex Dieter adf30a
 libs/imapparser.cpp                |  1 +
Rex Dieter adf30a
 libs/tests/imapparserbenchmark.cpp | 19 +++++++++++++++++++
Rex Dieter adf30a
 2 files changed, 20 insertions(+)
Rex Dieter adf30a
Rex Dieter adf30a
diff --git a/libs/imapparser.cpp b/libs/imapparser.cpp
Rex Dieter adf30a
index 6f9f592..f3301e7 100644
Rex Dieter adf30a
--- a/libs/imapparser.cpp
Rex Dieter adf30a
+++ b/libs/imapparser.cpp
Rex Dieter adf30a
@@ -186,6 +186,7 @@ int ImapParser::parseQuotedString( const QByteArray &data, QByteArray &result, i
Rex Dieter adf30a
   // quoted string
Rex Dieter adf30a
   if ( data[begin] == '"' ) {
Rex Dieter adf30a
     ++begin;
Rex Dieter adf30a
+    result.reserve(qMin(32, data.size() - begin));
Rex Dieter adf30a
     for ( int i = begin; i < data.length(); ++i ) {
Rex Dieter adf30a
       const char ch = data.at( i );
Rex Dieter adf30a
       if ( foundSlash ) {
Rex Dieter adf30a
diff --git a/libs/tests/imapparserbenchmark.cpp b/libs/tests/imapparserbenchmark.cpp
Rex Dieter adf30a
index fd4335c..ee861a0 100644
Rex Dieter adf30a
--- a/libs/tests/imapparserbenchmark.cpp
Rex Dieter adf30a
+++ b/libs/tests/imapparserbenchmark.cpp
Rex Dieter adf30a
@@ -95,6 +95,25 @@ class ImapParserBenchmark : public QObject
Rex Dieter adf30a
       }
Rex Dieter adf30a
     }
Rex Dieter adf30a
 
Rex Dieter adf30a
+    void parseString_data()
Rex Dieter adf30a
+    {
Rex Dieter adf30a
+      QTest::addColumn<QByteArray>( "data" );
Rex Dieter adf30a
+      QTest::newRow("plain") << QByteArray("fooobarasdf something more lalala");
Rex Dieter adf30a
+      QTest::newRow("quoted") << QByteArray("\"fooobarasdf\" something more lalala");
Rex Dieter adf30a
+    }
Rex Dieter adf30a
+
Rex Dieter adf30a
+    void parseString()
Rex Dieter adf30a
+    {
Rex Dieter adf30a
+      QFETCH(QByteArray, data);
Rex Dieter adf30a
+      QByteArray result;
Rex Dieter adf30a
+      qint64 sum = 0;
Rex Dieter adf30a
+      QBENCHMARK {
Rex Dieter adf30a
+        sum += ImapParser::parseString( data, result );
Rex Dieter adf30a
+      }
Rex Dieter adf30a
+      QVERIFY(!result.isEmpty());
Rex Dieter adf30a
+      QVERIFY(sum > 0);
Rex Dieter adf30a
+    }
Rex Dieter adf30a
+
Rex Dieter adf30a
     void parseNumber()
Rex Dieter adf30a
     {
Rex Dieter adf30a
       QByteArray data( "123456" );
Rex Dieter adf30a
-- 
Rex Dieter adf30a
2.1.0
Rex Dieter adf30a