blob: 7ecc2a336e68572f35779c97fb22e791a0f7c637 (
plain) (
tree)
|
|
#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 = -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();
}
|