new qRandomUuid() function

benchmark result:
********* Start testing of tst_bench_QUuid *********
Config: Using QTest library 4.12.0, Katie 4.12.0
PASS  : tst_bench_QUuid::initTestCase()
RESULT   : tst_bench_QUuid::qRandomUuid_vs_createUuid():"qRandomUuid()":
     97.821250 CPU ticks per iteration (total: 19,564,250, iterations: 200000)
RESULT   : tst_bench_QUuid::qRandomUuid_vs_createUuid():"QUuid::createUuid":
     108.41198 CPU ticks per iteration (total: 21,682,396, iterations: 200000)
PASS  : tst_bench_QUuid::qRandomUuid_vs_createUuid()
RESULT   : tst_bench_QUuid::createUuid():
     57.377920 CPU ticks per iteration (total: 11,475,584, iterations: 200000)
PASS  : tst_bench_QUuid::createUuid()
RESULT   : tst_bench_QUuid::fromChar():
     81.606610 CPU ticks per iteration (total: 16,321,322, iterations: 200000)
PASS  : tst_bench_QUuid::fromChar()
RESULT   : tst_bench_QUuid::toString():
     79.527925 CPU ticks per iteration (total: 15,905,585, iterations: 200000)
PASS  : tst_bench_QUuid::toString()
RESULT   : tst_bench_QUuid::fromString():
     78.037890 CPU ticks per iteration (total: 15,607,578, iterations: 200000)
PASS  : tst_bench_QUuid::fromString()
RESULT   : tst_bench_QUuid::toByteArray():
     78.505810 CPU ticks per iteration (total: 15,701,162, iterations: 200000)
PASS  : tst_bench_QUuid::toByteArray()
RESULT   : tst_bench_QUuid::fromByteArray():
     79.680680 CPU ticks per iteration (total: 15,936,136, iterations: 200000)
PASS  : tst_bench_QUuid::fromByteArray()
RESULT   : tst_bench_QUuid::toRfc4122():
     62.749495 CPU ticks per iteration (total: 12,549,899, iterations: 200000)
PASS  : tst_bench_QUuid::toRfc4122()
RESULT   : tst_bench_QUuid::fromRfc4122():
     7.604070 CPU ticks per iteration (total: 1,520,814, iterations: 200000)
PASS  : tst_bench_QUuid::fromRfc4122()
RESULT   : tst_bench_QUuid::toDataStream():
     100.19905 CPU ticks per iteration (total: 20,039,811, iterations: 200000)
PASS  : tst_bench_QUuid::toDataStream()
RESULT   : tst_bench_QUuid::fromDataStream():
     68.303560 CPU ticks per iteration (total: 13,660,712, iterations: 200000)
PASS  : tst_bench_QUuid::fromDataStream()
RESULT   : tst_bench_QUuid::isNull():
     6.075315 CPU ticks per iteration (total: 1,215,063, iterations: 200000)
PASS  : tst_bench_QUuid::isNull()
RESULT   : tst_bench_QUuid::operatorLess():
     18.49353 CPU ticks per iteration (total: 3,698,706, iterations: 200000)
PASS  : tst_bench_QUuid::operatorLess()
RESULT   : tst_bench_QUuid::operatorMore():
     18.51902 CPU ticks per iteration (total: 3,703,804, iterations: 200000)
PASS  : tst_bench_QUuid::operatorMore()
PASS  : tst_bench_QUuid::cleanupTestCase()
Totals: 16 passed, 0 failed, 0 skipped
********* Finished testing of tst_bench_QUuid *********

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2022-03-22 11:39:22 +02:00
parent 43dad8b245
commit a6eb4e3817
3 changed files with 77 additions and 0 deletions

View file

@ -292,6 +292,56 @@ quint16 qChecksum(const char *data, uint len)
return ~crc & 0xffff;
}
/*!
\relates QByteArray
Returns pseudo-randomly generated UUID in DCE variant as
described in \l{https://www.ietf.org/rfc/rfc4122.txt}.
*/
QByteArray qRandomUuid()
{
static const ushort randiterratio = (sizeof(int) / sizeof(uchar));
Q_ASSERT(randiterratio > 1);
QSTACKARRAY(uchar, randombuf, 16);
uchar *randombufiter = randombuf;
for (ushort i = 0; i < (16 / randiterratio); i++) {
*randombufiter = qrand();
randombufiter += randiterratio;
}
randombuf[6] = (randombuf[6] & 0x0FFF) | 0x4000; // random version
randombuf[8] = (randombuf[8] & 0x3F) | 0x80; // DCE variant
#define UUID_TOHEX(bufi, randi) \
uuidbuf[bufi] = tohex[(randombuf[randi] >> 4) & 0xf]; \
uuidbuf[bufi + 1] = tohex[randombuf[randi] & 0xf];
static const char tohex[] = "0123456789abcdef";
QSTACKARRAY(char, uuidbuf, 37);
UUID_TOHEX(0, 0);
UUID_TOHEX(2, 1);
UUID_TOHEX(4, 2);
UUID_TOHEX(6, 3);
uuidbuf[8] = '-';
UUID_TOHEX(9, 4);
UUID_TOHEX(11, 5);
uuidbuf[13] = '-';
UUID_TOHEX(14, 6);
UUID_TOHEX(16, 7);
uuidbuf[18] = '-';
UUID_TOHEX(19, 8);
UUID_TOHEX(21, 9);
uuidbuf[23] = '-';
UUID_TOHEX(24, 10);
UUID_TOHEX(26, 11);
UUID_TOHEX(28, 12);
UUID_TOHEX(30, 13);
UUID_TOHEX(32, 14);
UUID_TOHEX(34, 15);
#undef UUID_TOHEX
return QByteArray(reinterpret_cast<char*>(uuidbuf), sizeof(uuidbuf));
}
#ifndef QT_NO_COMPRESS
/*!
\fn QByteArray qCompress(const QByteArray& data, int compressionLevel)

View file

@ -71,6 +71,8 @@ inline int qstrnicmp(const char *str1, const char *str2, uint len)
// qChecksum: Internet checksum
Q_CORE_EXPORT quint16 qChecksum(const char *s, uint len);
Q_CORE_EXPORT QByteArray qRandomUuid();
class QByteRef;
class QString;
class QDataStream;

View file

@ -34,6 +34,8 @@ public:
{ }
private slots:
void qRandomUuid_vs_createUuid_data();
void qRandomUuid_vs_createUuid();
void createUuid();
void fromChar();
void toString();
@ -49,6 +51,29 @@ private slots:
void operatorMore();
};
void tst_bench_QUuid::qRandomUuid_vs_createUuid_data()
{
QTest::addColumn<bool>("qrandomuuid");
QTest::newRow("qRandomUuid()") << true;
QTest::newRow("QUuid::createUuid") << false;
}
void tst_bench_QUuid::qRandomUuid_vs_createUuid()
{
QFETCH(bool, qrandomuuid);
if (qrandomuuid) {
QBENCHMARK {
(void)qRandomUuid();
}
} else {
QBENCHMARK {
(void)QUuid::createUuid().toByteArray();
}
}
}
void tst_bench_QUuid::createUuid()
{
QBENCHMARK {