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