summaryrefslogtreecommitdiffstats
path: root/src/copythread.cpp
blob: 5b9710b4fecb529a8586f56439a9520c9cb85968 (plain) (blame)
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
75
76
77
#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)

#define BIGRAND (qint64(qrand()) | (qint64(qrand()) * qint64(RAND_MAX)))

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() - BUFFER_SIZE;

	// Sequential read
	emit logMessage(trUtf8("Starting sequential read test"));
	if (size > 0) {
		_file->seek(BIGRAND % size);
	}
	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
	if (size > 0) {
		emit logMessage(trUtf8("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(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();
}