1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
#include "copythread.h"
#include <QFile>
#include <QElapsedTimer>
#include <QCoreApplication>
#include <QDebug>
#include <QRandomGenerator>
// 1M read size
#define BUFFER_SIZE (1000000)
// 30 seconds for each test
#define TEST_LENGTH (30000)
#define BIGRAND (QRandomGenerator::global()->generate64())
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;
const qint64 size = _file->size();
// Sequential read
emit logMessage(CopyThread::TestSequentialStart, tr("Starting sequential read test"));
timer.start();
do {
ret = _file->read(buffer, BUFFER_SIZE);
seqSum += ret;
if (ret == 0)
break; // EOF
} while (!_doStop && ret > 0 && timer.elapsed() < TEST_LENGTH);
seqTime = timer.elapsed();
// Random read
if (size > 0) {
emit logMessage(CopyThread::TestRandomStart, tr("Starting random read test"));
timer.restart();
do {
_file->seek(BIGRAND % 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(CopyThread::TestFinished, tr("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();
}
|