diff --git a/autotests/benchmarks/positioncodecbenchmark.cpp b/autotests/benchmarks/positioncodecbenchmark.cpp --- a/autotests/benchmarks/positioncodecbenchmark.cpp +++ b/autotests/benchmarks/positioncodecbenchmark.cpp @@ -31,28 +31,36 @@ Q_OBJECT private Q_SLOTS: void initTestCase(); - // data 1 - a lot of positions, small amount of PositionInfo + // data 1 - small number of documents, each with many positions void benchEncodeData1(); void benchDecodeData1(); - // data 2 - few positions, large amount of PositionInfo + // data 2 - large number of documents, few positions (10) each void benchEncodeData2(); void benchDecodeData2(); + // data 3 - small number of documents, many positions with large increment + void benchEncodeData3(); + void benchDecodeData3(); private: QVector m_benchmarkData1; QVector m_benchmarkData2; + QVector m_benchmarkData3; }; void PositionCodecBenchmark::initTestCase() { + /* + * Same dataset as in autotests/unit/codecs/positioncodectest.cpp + * Correctness of encoding/decoding is checked there. + */ m_benchmarkData1.clear(); m_benchmarkData1.reserve(100); for(int i = 0; i < 100; ++i) { PositionInfo info; info.docId = (i + 1) * 4711; info.positions.reserve(3000); for (int j = 0; j < 3000; j++) - info.positions.append(((j + 1) * 42) / info.docId); + info.positions.append(((j + 1) * (i + 2))); m_benchmarkData1.append(info); } @@ -66,6 +74,17 @@ m_benchmarkData2.append(info); } + m_benchmarkData3.clear(); + m_benchmarkData3.reserve(200); + for (int i = 0; i < 200; i++) { + PositionInfo info; + info.docId = i; + info.positions.reserve(30000); // > 2^14 -> 3 byte VarInt32 + for (int j = 0; j < 30000; j++) + info.positions.append((j + 1) * 200); // increment 200 -> 2 byte DiffVarInt32 + + m_benchmarkData3.append(info); + } } void PositionCodecBenchmark::benchEncodeData1() @@ -94,6 +113,19 @@ QBENCHMARK { pc.decode(ba); } } +void PositionCodecBenchmark::benchEncodeData3() +{ + PositionCodec pc; + QBENCHMARK { pc.encode(m_benchmarkData3); } +} + +void PositionCodecBenchmark::benchDecodeData3() +{ + PositionCodec pc; + const QByteArray ba = pc.encode(m_benchmarkData3); + QBENCHMARK { pc.decode(ba); } +} + QTEST_MAIN(PositionCodecBenchmark) #include "positioncodecbenchmark.moc" diff --git a/autotests/unit/codecs/positioncodectest.cpp b/autotests/unit/codecs/positioncodectest.cpp --- a/autotests/unit/codecs/positioncodectest.cpp +++ b/autotests/unit/codecs/positioncodectest.cpp @@ -35,8 +35,12 @@ private Q_SLOTS: void initTestCase(); void checkEncodeOutput(); + void checkEncodeOutput2(); + void checkEncodeOutput3(); private: QVector m_data; + QVector m_data2; + QVector m_data3; }; QTEST_MAIN ( PositionCodecTest ) @@ -51,21 +55,67 @@ info.docId = (i + 1) * 4711; info.positions.reserve(3000); for (int j = 0; j < 3000; j++) - info.positions.append(((j + 1) * 42) / info.docId); + info.positions.append((j + 1) * (i * 2)); m_data.append(info); } + + m_data2.clear(); + m_data2.reserve(5000); + for (int i = 0; i < 5000; i++) { + PositionInfo info; + info.docId = i; + info.positions = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; + + m_data2.append(info); + } + + m_data3.clear(); + m_data3.reserve(200); + for (int i = 0; i < 200; i++) { + PositionInfo info; + info.docId = i; + info.positions.reserve(30000); // > 2^14 -> 3 byte VarInt32 + for (int j = 0; j < 30000; j++) + info.positions.append((j + 1) * 200); // increment 200 -> 2 byte DiffVarInt32 + + m_data3.append(info); + } } void PositionCodecTest::checkEncodeOutput() { PositionCodec pc; const QByteArray ba = pc.encode(m_data); - QCOMPARE(ba.size(), 301000); + QCOMPARE(ba.size(), 409000); const QByteArray md5 = QCryptographicHash::hash(ba, QCryptographicHash::Md5).toHex(); - QCOMPARE(md5, QByteArray("d44a606d301937bef105411c0ee77a88")); + QCOMPARE(md5, QByteArray("ae49eb3279bdda36ef91d29ce3c94c2c")); // and now decode the whole stuff QVector decodedData = pc.decode(ba); QCOMPARE(m_data, decodedData); } +void PositionCodecTest::checkEncodeOutput2() +{ + PositionCodec pc; + const QByteArray ba = pc.encode(m_data2); + QCOMPARE(ba.size(), (8 + 1 + 10) * 5000); // DocId, VarInt32 len, DiffVarInt position + const QByteArray md5 = QCryptographicHash::hash(ba, QCryptographicHash::Md5).toHex(); + QCOMPARE(md5, QByteArray("2f3710246331002e2332dce560ccd783")); + // and now decode the whole stuff + QVector decodedData = pc.decode(ba); + QCOMPARE(m_data2, decodedData); +} + +void PositionCodecTest::checkEncodeOutput3() +{ + PositionCodec pc; + const QByteArray ba = pc.encode(m_data3); + QCOMPARE(ba.size(), (8 + 3 + (2 * 30000)) * 200); // DocId, VarInt32 len, DiffVarInt position + const QByteArray md5 = QCryptographicHash::hash(ba, QCryptographicHash::Md5).toHex(); + QCOMPARE(md5, QByteArray("79e942003c082073b4cee8e376fffdaa")); + // and now decode the whole stuff + QVector decodedData = pc.decode(ba); + QCOMPARE(m_data3, decodedData); +} + #include "positioncodectest.moc"