|
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 |
|