From d4f10f9fe446da2aff65088e5236d6ffcdd034b5 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 24 Feb 2017 12:33:55 +0100 Subject: initial commit --- src/copythread.cpp | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/copythread.cpp (limited to 'src/copythread.cpp') diff --git a/src/copythread.cpp b/src/copythread.cpp new file mode 100644 index 0000000..1f9ec2f --- /dev/null +++ b/src/copythread.cpp @@ -0,0 +1,72 @@ +#include "copythread.h" +#include +#include +#include +#include + +// 1M read size +#define BUFFER_SIZE (1000000) +// 20 seconds for each test +#define TEST_LENGTH (60000) + +CopyThread::CopyThread(QFile *file, QObject *parent) + : QThread(parent), + _doStop(false) +{ + _file = file; +} + +CopyThread::~CopyThread() +{ + delete _file; +} + +void CopyThread::stop() +{ + _doStop = true; +} + +void CopyThread::run() +{ + qDebug() << "Entering run method"; + char *buffer = new char[BUFFER_SIZE]; + QElapsedTimer timer; + qint64 ret; + qint64 seqSum = 0, rndSum = 0; + qint64 seqTime, rndTime = -1; + + // Sequential read + emit logMessage(trUtf8("Starting sequential read test")); + timer.start(); + do { + ret = _file->read(buffer, BUFFER_SIZE); + seqSum += ret; + if (ret == 0) { + _file->seek(0); + } + } while (!_doStop && ret >= 0 && timer.elapsed() < TEST_LENGTH); + seqTime = timer.elapsed(); + + // Random read + qsrand((uint)QCoreApplication::applicationPid()); + const qint64 size = _file->size() - BUFFER_SIZE; + if (size > 0) { + emit logMessage(trUtf8("Starting random read test")); + timer.restart(); + do { + _file->seek(((qint64)qrand() ^ ((qint64)qrand() << 15)) % size); + ret = _file->read(buffer, BUFFER_SIZE); + rndSum += ret; + } while (!_doStop && ret > 0 && timer.elapsed() < TEST_LENGTH); + rndTime = timer.elapsed(); + } + + // All done + const qint64 seqSpeed = seqSum / (seqTime * 1024 + 1); + const qint64 rndSpeed = rndSum / (rndTime * 1024 + 1); + emit logMessage(trUtf8("Seq: %1MiB/s, Random: %2MiB/s - [%3s / %4s]") + .arg(QString::number(seqSpeed), QString::number(rndSpeed), + QString::number(seqTime / 1000), QString::number(rndTime / 1000))); + delete[] buffer; + _file->close(); +} -- cgit v1.2.3-55-g7522