m4n71k0r

Untitled

Jun 9th, 2012
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.      * TProfiler.cpp
  3.      *
  4.      *  Created on: 29.02.2012
  5.      *      Author: fylh
  6.      */
  7.      
  8.     #include "config.h"
  9.     #include "Profiler.h"
  10.     #include "Hashers/NumberSystemHasher.h"
  11.     #include "Hashers/CloserHasher.h"
  12.     #include "DataBase.h"
  13.     #include <stdexcept>
  14.     #include <qdebug.h>
  15.      
  16.     namespace db {
  17.      
  18.     TProfiler::TProfiler() {
  19.             _nativeCount = 0;
  20.             _recToRead = 0;
  21.             _dbSize = 0;
  22.     }
  23.      
  24.     void TProfiler::settings(QString settingFile) {
  25.             QSettings settings(settingFile, QSettings::IniFormat);
  26.             _source = settings.value("Source").toString();
  27.             _dir1 = settings.value("Hasher1").toString();
  28.             _dir2 = settings.value("Hasher2").toString();
  29.             _stepsFile = settings.value("Steps").toString();
  30.             _output = settings.value("Output", "out").toString();
  31.             _dbSize = settings.value("DBsize").toInt();
  32.             _recToRead = settings.value("RecordsToRead").toInt();
  33.             _searchFile = settings.value("Search").toString();
  34.     #ifdef DEBUG3
  35.             qDebug() << _source << _dir1 << _dir2 << _stepsFile;
  36.     #endif
  37.             setSteps();
  38.             _hashers[0] = NumberSystemHasher::build;
  39.             _hashers[1] = CloserHasher::build;
  40.     }
  41.      
  42.     void TProfiler::profile() {
  43.             QDir rootDir;
  44.             rootDir.mkdir(_dir1);
  45.             rootDir.mkdir(_dir2);
  46.      
  47.             _hashDir[0] = QDir(rootDir.absolutePath() + "/" + _dir1);
  48.             _hashDir[1] = QDir(rootDir.absolutePath() + "/" + _dir2);
  49.             clean(_hashDir[0]);
  50.             clean(_hashDir[1]);
  51.             for (int i = 0; i < _steps.size(); ++i) {
  52.                     for (int numberOfPackages = _steps[i].begin;
  53.                                     numberOfPackages < _steps[i].end;
  54.                                     numberOfPackages += _steps[i].step) {
  55.                             qDebug() << numberOfPackages;
  56.                             for (int hasher = 0; hasher < 2; ++hasher) {
  57.                                     DataBase base(
  58.                                                     _hashDir[hasher].absolutePath() + "/"
  59.                                                                     + QString::number(numberOfPackages) + ".db",
  60.                                                     _dbSize, numberOfPackages, _hashers[hasher]);
  61.                                     base.buildDB(_source, _recToRead);
  62.                                     searchInDB(&base);
  63.                                     logResult(numberOfPackages, hasher);
  64.                                     cleanResult();
  65.                             }
  66.                     }
  67.      
  68.             }
  69.     #ifdef DEBUG4
  70.             qDebug() << _ro[0];
  71.             qDebug() << _ro[1];
  72.             qDebug();
  73.             qDebug() << _over[0];
  74.             qDebug() << _over[1];
  75.     #endif
  76.             flushLogs();
  77.     }
  78.      
  79.     void TProfiler::insertedInNative() {
  80.             ++_nativeCount;
  81.     }
  82.      
  83.     void TProfiler::clean(QDir dir) {
  84.             QDirIterator wolker(dir.absolutePath(), QDir::Files);
  85.             while (wolker.hasNext()) {
  86.                     QFile::remove(wolker.next());
  87.             }
  88.     }
  89.      
  90.     void TProfiler::setSteps() {
  91.             QFile file(_stepsFile);
  92.             if (!file.open(QFile::ReadOnly)) {
  93.                     throw new std::runtime_error(
  94.                                     (QString("Cann't open file ") + _stepsFile).toAscii().data());
  95.             }
  96.             QTextStream stream(&file);
  97.             while (!stream.atEnd()) {
  98.                     Step step;
  99.                     QString line = stream.readLine();
  100.     #ifdef DEBUG3
  101.                     qDebug() << line;
  102.     #endif
  103.                     QStringList takeStep = line.split(" step ", QString::SkipEmptyParts,
  104.                                     Qt::CaseInsensitive);
  105.                     bool state;
  106.                     step.step = takeStep[1].toInt(&state);
  107.                     if (state == false) {
  108.                             throw new std::runtime_error("Invalid step file.");
  109.                     }
  110.                     QStringList borders = takeStep[0].split("..", QString::SkipEmptyParts);
  111.                     step.begin = borders[0].toInt(&state);
  112.                     if (state == false) {
  113.                             throw new std::runtime_error("Invalid step file.");
  114.                     }
  115.                     step.end = borders[1].toInt(&state);
  116.                     if (state == false) {
  117.                             throw new std::runtime_error("Invalid step file.");
  118.                     }
  119.     #ifdef DEBUG3
  120.                     qDebug() << step.begin << step.end << step.step;
  121.     #endif
  122.                     _steps.push_back(step);
  123.             }
  124.      
  125.     }
  126.      
  127.     TProfiler::~TProfiler() {
  128.     #ifdef MEM_DEBUG
  129.             qDebug() << "Profiler destroyed";
  130.     #endif
  131.     }
  132.      
  133.     void TProfiler::logResult(int number, int hasher) {
  134.             Point point;
  135.             point.y = static_cast<float>(_nativeCount) / static_cast<float>(_dbSize)
  136.                             * 100.;
  137.             point.x = number;
  138.             _ro[hasher].push_back(point);
  139.             point.y = static_cast<float>(_recToRead - _nativeCount) / _recToRead * 100.;
  140.             _over[hasher].push_back(point);
  141.             point.y = _searchTime;
  142.             _time[hasher].push_back(point);
  143.     }
  144.      
  145.     void TProfiler::cleanResult() {
  146.             _nativeCount = 0;
  147.             _searchTime = 0;
  148.     }
  149.     /* namespace db */
  150.      
  151.     void TProfiler::flushLogs() {
  152.             for (int i = 0; i < 2; ++i) {
  153.                     QFile fileRo(_hashDir[i].absoluteFilePath(_output + ".ro"));
  154.                     if (!fileRo.open(QFile::WriteOnly)) {
  155.                             throw new std::runtime_error("Cann't write to output ro.");
  156.                     }
  157.                     QDataStream stream(&fileRo);
  158.                     stream << _ro[i];
  159.                     fileRo.close();
  160.      
  161.                     QFile fileOver(_hashDir[i].absoluteFilePath(_output + ".over"));
  162.                     if (!fileOver.open(QFile::WriteOnly)) {
  163.                             throw new std::runtime_error("Cann't write to output over.");
  164.                     }
  165.                     stream.setDevice(&fileOver);
  166.                     stream << _over[i];
  167.                     fileOver.close();
  168.      
  169.                     QFile fileTime(_hashDir[i].absoluteFilePath(_output + ".time"));
  170.                     if (!fileTime.open(QFile::WriteOnly)) {
  171.                             throw new std::runtime_error("Cann't write to output over.");
  172.                     }
  173.                     stream.setDevice(&fileTime);
  174.                     stream << _time[i];
  175.                     fileTime.close();
  176.             }
  177.     }
  178.      
  179.     void TProfiler::searchInDB(DataBase* db) {
  180.      
  181.             QFile searchFile(_searchFile);
  182.             if (!searchFile.open(QFile::ReadOnly)) {
  183.                     qDebug() << "Skip searching.";
  184.                     return;
  185.             }
  186.             char* array = reinterpret_cast<char*>(searchFile.map(0, searchFile.size()));
  187.             QTime timer;
  188.             timer.start();
  189.             int size = _recToRead*7*1.002;
  190.             for (int i = 0; i < size; i+=7) {
  191.                     Record* r = db->searchByID(&array[i]);
  192.                     //qDebug() << r->ID << r->string;
  193.                     if (r != NULL) delete r;
  194.             }
  195.             _searchTime = timer.elapsed();
  196.             qDebug() << "Time:" << _searchTime;
  197.             searchFile.close();
  198.     }
  199.      
  200.     }
  201.      
  202.     #ifdef DEBUG4
  203.     QDebug& operator <<(QDebug& stream, db::TProfiler::Point point) {
  204.             stream << point.x << ", " << point.y;
  205.             return stream;
  206.     }
  207.     #endif
  208.      
  209.     QDataStream& operator <<(QDataStream& stream, db::TProfiler::Point point) {
  210.             stream << point.x << point.y;
  211.             return stream;
  212.     }
  213.      
  214.     QDataStream& operator >>(QDataStream& stream, db::TProfiler::Point point) {
  215.             stream >> point.x >> point.y;
  216.             return stream;
  217.     }
Advertisement
Add Comment
Please, Sign In to add comment