summaryrefslogtreecommitdiffstats
path: root/src/copythread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/copythread.cpp')
-rw-r--r--src/copythread.cpp72
1 files changed, 72 insertions, 0 deletions
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 <QFile>
+#include <QElapsedTimer>
+#include <QCoreApplication>
+#include <QDebug>
+
+// 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();
+}