Brush up QReadWriteLock benchmark
- add override - tests C++17 shared_mutex in addition to C++14 shared_timed_mutex - replace manual memory management with unique_ptr Change-Id: If52df2097a4b92c10df4a7cdbb1c506d64b673e3 Reviewed-by: Mårten Nordheim <marten.nordheim@qt.io>
This commit is contained in:
parent
3fede6cb54
commit
72259e7186
@ -1,6 +1,7 @@
|
|||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
TARGET = tst_bench_qreadwritelock
|
TARGET = tst_bench_qreadwritelock
|
||||||
QT = core testlib
|
QT = core-private testlib
|
||||||
SOURCES += tst_qreadwritelock.cpp
|
SOURCES += tst_qreadwritelock.cpp
|
||||||
CONFIG += c++14 # for std::shared_timed_mutex
|
CONFIG += c++14 # for std::shared_timed_mutex
|
||||||
|
CONFIG += c++1z # for std::shared_mutex
|
||||||
|
|
||||||
|
@ -28,12 +28,14 @@
|
|||||||
|
|
||||||
#include <QtCore/QtCore>
|
#include <QtCore/QtCore>
|
||||||
#include <QtTest/QtTest>
|
#include <QtTest/QtTest>
|
||||||
|
#include <QtCore/private/qmemory_p.h>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#if QT_HAS_INCLUDE(<shared_mutex>)
|
#if QT_HAS_INCLUDE(<shared_mutex>)
|
||||||
#if __cplusplus > 201103L
|
#if __cplusplus > 201103L
|
||||||
#include <shared_mutex>
|
#include <shared_mutex>
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
// Wrapers that take pointers instead of reference to have the same interface as Qt
|
// Wrapers that take pointers instead of reference to have the same interface as Qt
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -106,6 +108,14 @@ void tst_QReadWriteLock::uncontended_data()
|
|||||||
<< FunctionPtrHolder(testUncontended<QReadWriteLock, QWriteLocker>);
|
<< FunctionPtrHolder(testUncontended<QReadWriteLock, QWriteLocker>);
|
||||||
QTest::newRow("std::mutex") << FunctionPtrHolder(
|
QTest::newRow("std::mutex") << FunctionPtrHolder(
|
||||||
testUncontended<std::mutex, LockerWrapper<std::unique_lock<std::mutex>>>);
|
testUncontended<std::mutex, LockerWrapper<std::unique_lock<std::mutex>>>);
|
||||||
|
#ifdef __cpp_lib_shared_mutex
|
||||||
|
QTest::newRow("std::shared_mutex, read") << FunctionPtrHolder(
|
||||||
|
testUncontended<std::shared_mutex,
|
||||||
|
LockerWrapper<std::shared_lock<std::shared_mutex>>>);
|
||||||
|
QTest::newRow("std::shared_mutex, write") << FunctionPtrHolder(
|
||||||
|
testUncontended<std::shared_mutex,
|
||||||
|
LockerWrapper<std::unique_lock<std::shared_mutex>>>);
|
||||||
|
#endif
|
||||||
#if defined __cpp_lib_shared_timed_mutex
|
#if defined __cpp_lib_shared_timed_mutex
|
||||||
QTest::newRow("std::shared_timed_mutex, read") << FunctionPtrHolder(
|
QTest::newRow("std::shared_timed_mutex, read") << FunctionPtrHolder(
|
||||||
testUncontended<std::shared_timed_mutex,
|
testUncontended<std::shared_timed_mutex,
|
||||||
@ -130,7 +140,7 @@ void testReadOnly()
|
|||||||
struct Thread : QThread
|
struct Thread : QThread
|
||||||
{
|
{
|
||||||
Mutex *lock;
|
Mutex *lock;
|
||||||
void run()
|
void run() override
|
||||||
{
|
{
|
||||||
for (int i = 0; i < Iterations; ++i) {
|
for (int i = 0; i < Iterations; ++i) {
|
||||||
QString s = QString::number(i); // Do something outside the lock
|
QString s = QString::number(i); // Do something outside the lock
|
||||||
@ -140,21 +150,20 @@ void testReadOnly()
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
Mutex lock;
|
Mutex lock;
|
||||||
QVector<QThread *> threads;
|
std::vector<std::unique_ptr<Thread>> threads;
|
||||||
for (int i = 0; i < threadCount; ++i) {
|
for (int i = 0; i < threadCount; ++i) {
|
||||||
auto t = new Thread;
|
auto t = qt_make_unique<Thread>();
|
||||||
t->lock = &lock;
|
t->lock = &lock;
|
||||||
threads.append(t);
|
threads.push_back(std::move(t));
|
||||||
}
|
}
|
||||||
QBENCHMARK {
|
QBENCHMARK {
|
||||||
for (auto t : threads) {
|
for (auto &t : threads) {
|
||||||
t->start();
|
t->start();
|
||||||
}
|
}
|
||||||
for (auto t : threads) {
|
for (auto &t : threads) {
|
||||||
t->wait();
|
t->wait();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qDeleteAll(threads);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QReadWriteLock::readOnly_data()
|
void tst_QReadWriteLock::readOnly_data()
|
||||||
@ -166,6 +175,11 @@ void tst_QReadWriteLock::readOnly_data()
|
|||||||
QTest::newRow("QReadWriteLock") << FunctionPtrHolder(testReadOnly<QReadWriteLock, QReadLocker>);
|
QTest::newRow("QReadWriteLock") << FunctionPtrHolder(testReadOnly<QReadWriteLock, QReadLocker>);
|
||||||
QTest::newRow("std::mutex") << FunctionPtrHolder(
|
QTest::newRow("std::mutex") << FunctionPtrHolder(
|
||||||
testReadOnly<std::mutex, LockerWrapper<std::unique_lock<std::mutex>>>);
|
testReadOnly<std::mutex, LockerWrapper<std::unique_lock<std::mutex>>>);
|
||||||
|
#ifdef __cpp_lib_shared_mutex
|
||||||
|
QTest::newRow("std::shared_mutex") << FunctionPtrHolder(
|
||||||
|
testReadOnly<std::shared_mutex,
|
||||||
|
LockerWrapper<std::shared_lock<std::shared_mutex>>>);
|
||||||
|
#endif
|
||||||
#if defined __cpp_lib_shared_timed_mutex
|
#if defined __cpp_lib_shared_timed_mutex
|
||||||
QTest::newRow("std::shared_timed_mutex") << FunctionPtrHolder(
|
QTest::newRow("std::shared_timed_mutex") << FunctionPtrHolder(
|
||||||
testReadOnly<std::shared_timed_mutex,
|
testReadOnly<std::shared_timed_mutex,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user