You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ktorrent/libktorrent/util/profiler.cpp

139 lines
3.5 KiB

/***************************************************************************
* Copyright (C) 2005 by Joris Guisson *
* joris.guisson@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
***************************************************************************/
#ifdef KT_PROFILE
#include <tqfile.h>
#include <tqtextstream.h>
#include <sys/time.h>
#include "profiler.h"
namespace bt
{
Profile::Profile(Profile* parent,const TQString & name) : parent(parent),name(name)
{
min = max = avg = 0.0;
count = 0;
start_time = 0.0;
children.setAutoDelete(true);
}
Profile::~Profile()
{
}
void Profile::start()
{
struct timeval tv;
gettimeofday(&tv,0);
start_time = tv.tv_sec * 1000.0 + tv.tv_usec * 0.001;
}
void Profile::end()
{
struct timeval tv;
gettimeofday(&tv,0);
double end_time = tv.tv_sec * 1000.0 + tv.tv_usec * 0.001;
double d = end_time - start_time;
// update stuff
if (d < min || count == 0)
min = d;
if (d > max || count == 0)
max = d;
avg = (avg * count + d) / (count + 1);
count++;
}
Profile* Profile::child(const TQString & name)
{
TQPtrList<Profile>::iterator i = children.begin();
while (i != children.end())
{
Profile* p = *i;
if (p->name == name)
return p;
i++;
}
Profile* p = new Profile(this,name);
children.append(p);
return p;
}
void Profile::save(TQTextStream & out,const TQString & base)
{
TQString nb = base + "/" + name;
out.precision(5);
out << qSetW(60) << nb << qSetW(10) << min << qSetW(10) << max << qSetW(10) << avg << qSetW(10) << count << endl;
TQPtrList<Profile>::iterator i = children.begin();
while (i != children.end())
{
Profile* p = *i;
p->save(out,nb);
i++;
}
}
/////////////////////
Profiler Profiler::inst;
Profiler::Profiler() : curr(0),root(0)
{
root = new Profile(0,"root");
curr = root;
}
Profiler::~Profiler()
{
delete root;
}
void Profiler::start(const TQString & s)
{
curr = curr->child(s);
curr->start();
}
void Profiler::end()
{
curr->end();
curr = curr->getParent();
}
void Profiler::saveToFile(const TQString & fn)
{
TQFile fptr(fn);
if (!fptr.open(IO_WriteOnly))
return;
TQTextStream out(&fptr);
out << qSetW(60) << "code" << qSetW(10) << "min" << qSetW(10) << "max" << qSetW(10) << "avg" << qSetW(10) << "count" << endl;
out << endl;
root->save(out,TQString());
}
}
#endif