summaryrefslogtreecommitdiffstats
path: root/src/copythread.cpp
blob: 44fe39dbe6f1fcff3f64fd2ec6da171588e812f2 (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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include "copythread.h"
#include <QFile>
#include <QElapsedTimer>
#include <QCoreApplication>
#include <QDebug>

// 1M read size
#define BUFFER_SIZE (1000000)
// 60 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 = 0;

	const qint64 size = _file->size() - BUFFER_SIZE;

	// Sequential read
	emit logMessage(trUtf8("Starting sequential read test"));
    printf("Starting sequential read test\n");
    if (size > 0) {
        _file->seek(BIGRAND % size);
	}
    timer.start();
	do {
		ret = _file->read(buffer, BUFFER_SIZE);
		seqSum += ret;
		if (ret == 0) {
			_file->seek(0);
		}
        seqTime = timer.elapsed();
        if (seqSum / (seqTime * 1024 + 1) >= 1) {
            printf("\r Seqential: %d MiB/s",int32_t(seqSum/(seqTime*1024+1)));
            fflush(stdout);
            emit logMessage(trUtf8("Seqential: %1MiB/s").arg(seqSum/(seqTime*1024+1)));
        }
        else {
            printf("\r Seqential: %d KiB/s",int32_t(seqSum/(seqTime+1)));
            fflush(stdout);
            emit logMessage(trUtf8("Seqential: %1KiB/s").arg(seqSum/(seqTime+1)));
        }
	} while (!_doStop && ret >= 0 && timer.elapsed() < TEST_LENGTH);

	// Random read
	if (size > 0) {
        printf("\n");
        fflush(stdout);
        emit logMessage(trUtf8("Starting random read test\n"));
		timer.restart();
		do {
			_file->seek(BIGRAND % size);
			ret = _file->read(buffer, BUFFER_SIZE);
			rndSum += ret;
            rndTime = timer.elapsed();
            if (seqSum / (seqTime * 1024 + 1) >= 1){

                printf("\r Random: %dMiB/s", int32_t(rndSum/(rndTime*1024+1)));
                fflush(stdout);
                emit logMessage(trUtf8("Random: %1MiB/s").arg(rndSum/(rndTime*1024+1)));
            }
            else {
                printf("\r Random: %dKiB/s", int32_t(rndSum/(rndTime+1)));
                fflush(stdout);
                emit logMessage(trUtf8("Random: %1KiB/s").arg(rndSum/(rndTime+1)));
            }
		} while (!_doStop && ret > 0 && timer.elapsed() < TEST_LENGTH);
		rndTime = timer.elapsed();
	}
    if (seqSum / (seqTime * 1024 + 1) >= 1) {
        const qint64 seqSpeed = seqSum / (seqTime * 1024 + 1);
        const qint64 rndSpeed = rndSum / (rndTime * 1024 + 1);
        printf("Seqential: %d MiB/s, Random: %dMiB/s - [%d / %d]",int32_t(seqSpeed), int32_t(rndSpeed), int32_t(seqTime / 1000), int32_t(rndTime / 1000));
        fflush(stdout);
        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)));
    } else {
        const qint64 seqSpeed = seqSum / (seqTime + 1);
        const qint64 rndSpeed = rndSum / (rndTime + 1);
        emit logMessage(trUtf8("Seq: %1KiB/s, Random: %2KiB/s - [%3s / %4s]")
                .arg(QString::number(seqSpeed), QString::number(rndSpeed),
                        QString::number(seqTime / 1000), QString::number(rndTime / 1000)));
    }
    // All done
	delete[] buffer;
	_file->close();
}