diff options
author | Antti Harju <antti.harju@ixonos.com> | 2012-10-24 10:56:46 +0300 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-11-03 00:24:37 +0100 |
commit | 8fb379dc8a4d7069a99c3181283e581b86e99ceb (patch) | |
tree | 75b8b73b42a03a96db1c2b3f7958c4b439f93d0f /tests/auto | |
parent | 0d9eba94dc73366a4a222c90d3f8deccc4cb19c6 (diff) |
Improve QByteDataBuffer::read() performance with partial reads
Add a read position variable to eliminate excessive memcpy'ing when
reading a partial buffer.
Specifically, fix performance issue of reading large files from
QNetworkDiskCache in QtWebKit2.
Task-number: QTBUG-27522
Change-Id: I21edc909bf9223971b2c3db5f1fa6b89c5b61c5f
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Antti Harju <antti.harju@ixonos.com>
Diffstat (limited to 'tests/auto')
4 files changed, 180 insertions, 0 deletions
diff --git a/tests/auto/corelib/tools/qbytedatabuffer/.gitignore b/tests/auto/corelib/tools/qbytedatabuffer/.gitignore new file mode 100644 index 0000000000..3024a4dba2 --- /dev/null +++ b/tests/auto/corelib/tools/qbytedatabuffer/.gitignore @@ -0,0 +1 @@ +tst_qbytedatabuffer diff --git a/tests/auto/corelib/tools/qbytedatabuffer/qbytedatabuffer.pro b/tests/auto/corelib/tools/qbytedatabuffer/qbytedatabuffer.pro new file mode 100644 index 0000000000..135b1ff8c4 --- /dev/null +++ b/tests/auto/corelib/tools/qbytedatabuffer/qbytedatabuffer.pro @@ -0,0 +1,4 @@ +TARGET = tst_qbytedatabuffer +CONFIG += testcase +QT += core-private testlib +SOURCES += tst_qbytedatabuffer.cpp diff --git a/tests/auto/corelib/tools/qbytedatabuffer/tst_qbytedatabuffer.cpp b/tests/auto/corelib/tools/qbytedatabuffer/tst_qbytedatabuffer.cpp new file mode 100644 index 0000000000..710da6cab3 --- /dev/null +++ b/tests/auto/corelib/tools/qbytedatabuffer/tst_qbytedatabuffer.cpp @@ -0,0 +1,174 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Hewlett-Packard Development Company, L.P. +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QTest> +#include <private/qbytedata_p.h> +// for QIODEVICE_BUFFERSIZE macro (== 16384): +#include <private/qiodevice_p.h> + +class tst_QByteDataBuffer : public QObject +{ + Q_OBJECT +private Q_SLOTS: + void canReadLine(); + void positionHandling(); + void appendBuffer(); + void readCompleteBuffer_data(); + void readCompleteBuffer(); + void readPartialBuffer_data(); + void readPartialBuffer(); +private: + void readBuffer(int size, int readSize); +}; + +void tst_QByteDataBuffer::canReadLine() +{ + QByteDataBuffer buf; + buf.append(QByteArray("a")); + buf.append(QByteArray("\nb")); + QVERIFY(buf.canReadLine()); + QVERIFY(buf.getChar() == 'a'); + QVERIFY(buf.canReadLine()); + QVERIFY(buf.getChar() == '\n'); + QVERIFY(!buf.canReadLine()); +} + +void tst_QByteDataBuffer::positionHandling() +{ + QByteDataBuffer buf; + buf.append(QByteArray("abc")); + buf.append(QByteArray("def")); + + QCOMPARE(buf.byteAmount(), (qlonglong)6); + QCOMPARE(buf.sizeNextBlock(), (qlonglong)3); + + QCOMPARE(buf.getChar(), 'a'); + QCOMPARE(buf.byteAmount(), (qlonglong)5); + QCOMPARE(buf.sizeNextBlock(), (qlonglong)2); + + QVERIFY(!strcmp(buf[0].constData(), "bc")); + QCOMPARE(buf.getChar(), 'b'); + QCOMPARE(buf.byteAmount(), (qlonglong)4); + QCOMPARE(buf.sizeNextBlock(), (qlonglong)1); + + QByteArray tmp("ab"); + buf.prepend(tmp); + QCOMPARE(buf.byteAmount(), (qlonglong)6); + QVERIFY(!strcmp(buf.readAll().constData(), "abcdef")); + QCOMPARE(buf.byteAmount(), (qlonglong)0); + + QByteDataBuffer buf2; + buf2.append(QByteArray("abc")); + buf2.getChar(); + QCOMPARE(buf2.read(), QByteArray("bc")); +} + +void tst_QByteDataBuffer::appendBuffer() +{ + QByteDataBuffer buf; + buf.append(QByteArray("\1\2\3")); + buf.getChar(); + + QByteDataBuffer tmp; + tmp.append(buf); + QCOMPARE(tmp.readAll(), buf.readAll()); +} + +static QByteArray makeByteArray(int size) +{ + QByteArray array; + array.resize(size); + char *data = array.data(); + for (int i = 0; i < size; ++i) + data[i] = i % 256; + return array; +} + + +void tst_QByteDataBuffer::readBuffer(int size, int readSize) +{ + QByteArray data = makeByteArray(size); + + QByteDataBuffer buf; + buf.append(data); + + QByteArray tmp; + tmp.resize(size); + + QBENCHMARK_ONCE { + for (int i = 0; i < (size - 1) / readSize + 1; ++i) + buf.read(tmp.data() + i * readSize, readSize); + } + + QCOMPARE(data.size(), tmp.size()); + QCOMPARE(data, tmp); +} + +void tst_QByteDataBuffer::readCompleteBuffer_data() +{ + QTest::addColumn<int>("size"); + QTest::newRow("10B") << (int)10; + QTest::newRow("1MB") << (int)1e6; + QTest::newRow("5MB") << (int)5e6; + QTest::newRow("10MB") << (int)10e6; +} + +void tst_QByteDataBuffer::readCompleteBuffer() +{ + QFETCH(int, size); + readBuffer(size, size); +} + +void tst_QByteDataBuffer::readPartialBuffer_data() +{ + readCompleteBuffer_data(); +} + +void tst_QByteDataBuffer::readPartialBuffer() +{ + QFETCH(int, size); + // QIODevice::readAll() reads in QIODEVICE_BUFFERSIZE size + // increments. + readBuffer(size, QIODEVICE_BUFFERSIZE); +} + +QTEST_MAIN(tst_QByteDataBuffer) +#include "tst_qbytedatabuffer.moc" diff --git a/tests/auto/corelib/tools/tools.pro b/tests/auto/corelib/tools/tools.pro index 47b0c5aa47..100409e58b 100644 --- a/tests/auto/corelib/tools/tools.pro +++ b/tests/auto/corelib/tools/tools.pro @@ -5,6 +5,7 @@ SUBDIRS=\ qbitarray \ qbytearray \ qbytearraymatcher \ + qbytedatabuffer \ qcache \ qchar \ qcontiguouscache \ |