Improve subsystem manager's timing statistics

Option to print statistics at run-time.
Convenient filter parameters to show subsystems with jitter or excessive
execution time only.
This commit is contained in:
ThorstenB
2011-03-23 23:12:13 +01:00
parent eae1b99036
commit 08ad449774
2 changed files with 63 additions and 14 deletions
+59 -12
View File
@@ -1,3 +1,22 @@
// Written by David Megginson, started 2000-12
//
// Copyright (C) 2000 David Megginson, david@megginson.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.
//
// $Id$
#include <simgear/debug/logstream.hxx> #include <simgear/debug/logstream.hxx>
#include <simgear/timing/timestamp.hxx> #include <simgear/timing/timestamp.hxx>
@@ -117,10 +136,11 @@ SGSubsystemGroup::SGSubsystemGroup () :
SGSubsystemGroup::~SGSubsystemGroup () SGSubsystemGroup::~SGSubsystemGroup ()
{ {
printTimingStatistics();
// reverse order to prevent order dependency problems // reverse order to prevent order dependency problems
for (unsigned int i = _members.size(); i > 0; i--) for (unsigned int i = _members.size(); i > 0; i--)
{ {
_members[i-1]->printTimingStatistics();
delete _members[i-1]; delete _members[i-1];
} }
} }
@@ -188,7 +208,7 @@ SGSubsystemGroup::update (double delta_time_sec)
{ {
SGTimeStamp timeStamp = SGTimeStamp::now(); SGTimeStamp timeStamp = SGTimeStamp::now();
_members[i]->update(delta_time_sec); // indirect call _members[i]->update(delta_time_sec); // indirect call
timeStamp = timeStamp - SGTimeStamp::now(); timeStamp = SGTimeStamp::now() - timeStamp;
double b = timeStamp.toUSecs(); double b = timeStamp.toUSecs();
_members[i]->updateExecutionTime(b); _members[i]->updateExecutionTime(b);
double threshold = _members[i]->getTimeWarningThreshold(); double threshold = _members[i]->getTimeWarningThreshold();
@@ -208,6 +228,16 @@ SGSubsystemGroup::collectDebugTiming(bool collect)
} }
} }
void
SGSubsystemGroup::printTimingStatistics(double minMaxTime,double minJitter)
{
for (unsigned int i = _members.size(); i > 0; i--)
{
_members[i-1]->printTimingStatistics(minMaxTime, minJitter);
_members[i-1]->timeStat.reset();
}
}
void void
SGSubsystemGroup::suspend () SGSubsystemGroup::suspend ()
{ {
@@ -267,8 +297,13 @@ SGSubsystemGroup::set_fixed_update_time(double dt)
_fixedUpdateTime = dt; _fixedUpdateTime = dt;
} }
/**
* Print timing statistics.
* Only show data if jitter exceeds minJitter or
* maximum time exceeds minMaxTime.
*/
void void
SGSubsystemGroup::Member::printTimingStatistics () SGSubsystemGroup::Member::printTimingStatistics(double minMaxTime,double minJitter)
{ {
if (collectTimeStats) { if (collectTimeStats) {
double minTime = timeStat.min() / 1000; double minTime = timeStat.min() / 1000;
@@ -276,13 +311,17 @@ SGSubsystemGroup::Member::printTimingStatistics ()
double meanTime = timeStat.mean() / 1000; double meanTime = timeStat.mean() / 1000;
double stddev = timeStat.stdDev() / 1000; double stddev = timeStat.stdDev() / 1000;
char buffer[256]; if ((maxTime - minTime >= minJitter)||
snprintf(buffer, 256, "Timing summary for %20s.\n" (maxTime >= minMaxTime))
"- mean time: %04.2f ms.\n" {
"- min time : %04.2f ms.\n" char buffer[256];
"- max time : %04.2f ms.\n" snprintf(buffer, 256, "Timing summary for %20s.\n"
"- stddev : %04.2f ms.\n", name.c_str(), meanTime, minTime, maxTime, stddev); "- mean time: %04.2f ms.\n"
SG_LOG(SG_GENERAL, SG_ALERT, buffer); "- min time : %04.2f ms.\n"
"- max time : %04.2f ms.\n"
"- stddev : %04.2f ms.\n", name.c_str(), meanTime, minTime, maxTime, stddev);
SG_LOG(SG_GENERAL, SG_ALERT, buffer);
}
} }
} }
@@ -368,7 +407,7 @@ void
SGSubsystemGroup::Member::printTimingInformation(double time) SGSubsystemGroup::Member::printTimingInformation(double time)
{ {
if (collectTimeStats) { if (collectTimeStats) {
SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem Timing Alert : " << time << " " << name); SG_LOG(SG_GENERAL, SG_ALERT, "Subsystem Timing Alert, subsystem \"" << name << "\": " << time/1000.0 << "ms");
subsystem->printTimingInformation(); subsystem->printTimingInformation();
} }
} }
@@ -547,4 +586,12 @@ SGSubsystemMgr::get_subsystem (const string &name) const
return s->second; return s->second;
} }
// end of fgfs.cxx void
SGSubsystemMgr::printTimingStatistics(double minMaxTime,double minJitter)
{
for (int i = 0; i < MAX_GROUPS; i++) {
_groups[i]->printTimingStatistics(minMaxTime, minJitter);
} // of groups iteration
}
// end of subsystem_mgr.cxx
+4 -2
View File
@@ -323,6 +323,7 @@ public:
virtual bool has_subsystem (const std::string &name) const; virtual bool has_subsystem (const std::string &name) const;
void collectDebugTiming(bool collect); void collectDebugTiming(bool collect);
void printTimingStatistics(double minMaxTime=0.0,double minJitter=0.0);
/** /**
* *
@@ -339,8 +340,8 @@ private:
virtual ~Member (); virtual ~Member ();
virtual void update (double delta_time_sec); virtual void update (double delta_time_sec);
void printTimingInformation(double time); void printTimingInformation(double time);
void printTimingStatistics(); void printTimingStatistics(double minMaxTime=0.0,double minJitter=0.0);
void updateExecutionTime(double time); void updateExecutionTime(double time);
double getTimeWarningThreshold(); double getTimeWarningThreshold();
void collectDebugTiming (bool collect) { collectTimeStats = collect; }; void collectDebugTiming (bool collect) { collectTimeStats = collect; };
@@ -427,6 +428,7 @@ public:
virtual SGSubsystem * get_subsystem(const std::string &name) const; virtual SGSubsystem * get_subsystem(const std::string &name) const;
void collectDebugTiming(bool collect); void collectDebugTiming(bool collect);
void printTimingStatistics(double minMaxTime=0.0,double minJitter=0.0);
private: private: