#include "copythread.h" #include #include #include #include // 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")); 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")); 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(); }