X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FUtils%2FStatistics.cc;h=6513828374d8fe90f74c8d8291f947dd02684c3a;hb=23a1bdee20b3fb19bd442efed8aa73b2bf0d585a;hp=01122b28278165b3ab727dd20cd4991c8ad710a3;hpb=9cb871b939efe93e35dd96808d25089399acfc46;p=senf.git diff --git a/senf/Utils/Statistics.cc b/senf/Utils/Statistics.cc index 01122b2..6513828 100644 --- a/senf/Utils/Statistics.cc +++ b/senf/Utils/Statistics.cc @@ -2,23 +2,28 @@ // // Copyright (C) 2008 // Fraunhofer Institute for Open Communication Systems (FOKUS) -// Competence Center NETwork research (NET), St. Augustin, GERMANY -// Stefan Bund // -// 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. +// The contents of this file are subject to the Fraunhofer FOKUS Public License +// Version 1.0 (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// http://senf.berlios.de/license.html // -// 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. +// The Fraunhofer FOKUS Public License Version 1.0 is based on, +// but modifies the Mozilla Public License Version 1.1. +// See the full license text for the amendments. // -// 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., -// 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +// Software distributed under the License is distributed on an "AS IS" basis, +// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +// for the specific language governing rights and limitations under the License. +// +// The Original Code is Fraunhofer FOKUS code. +// +// The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. +// (registered association), Hansastraße 27 c, 80686 Munich, Germany. +// All Rights Reserved. +// +// Contributor(s): +// Stefan Bund /** \file \brief Statistics non-inline non-template implementation */ @@ -28,26 +33,31 @@ // Custom includes #include +#include #include -#include #include +#include #include "StatisticsTargets.hh" //#include "Statistics.mpp" #define prefix_ -///////////////////////////////cc.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::StatisticsBase -prefix_ void senf::StatisticsBase::enter(float min, float avg, float max, float dev) +prefix_ void senf::StatisticsBase::enter(unsigned n, float min, float avg, float max, float dev) { min_ = min; avg_ = avg; max_ = max; dev_ = dev; - generateOutput(); - signalChildren(); + for (unsigned i (0); i < n; ++i) + generateOutput(); + Children::iterator i (children_.begin()); + Children::iterator const i_end (children_.end()); + for (; i != i_end; ++i) + i->second.enter(n, min_, avg_, max_, dev_); } prefix_ senf::Collector & senf::StatisticsBase::operator[](unsigned rank) @@ -58,6 +68,15 @@ prefix_ senf::Collector & senf::StatisticsBase::operator[](unsigned rank) return i->second; } +prefix_ senf::Collector const & senf::StatisticsBase::operator[](unsigned rank) + const +{ + Children::const_iterator i (children_.find(rank)); + if (i == children_.end()) + throw InvalidRankException(); + return i->second; +} + prefix_ senf::Collector & senf::StatisticsBase::collect(unsigned rank) { std::pair state ( @@ -90,16 +109,16 @@ prefix_ void senf::StatisticsBase::consoleList(unsigned level, std::ostream & os os << boost::format("%s%-5d%|15t| %12.5g %19.5g %12.5g\n") % std::string(2*level,' ') % rank() - % fmt::eng(min()).setw() % fmt::eng(avg(),dev()).setw() % fmt::eng(max()).setw(); + % fmt::eng(min()).setw().showbase() % fmt::eng(avg(),dev()).setw().showbase() % fmt::eng(max()).setw().showbase(); { OutputMap::const_iterator i (outputs_.begin()); OutputMap::const_iterator i_end (outputs_.end()); for (; i != i_end; ++i) os << boost::format(" %3d %12.5g %19.5g %12.5g\n") % i->second.n - % fmt::eng(i->second.min).setw() - % fmt::eng(i->second.avg, i->second.dev).setw() - % fmt::eng(i->second.max).setw(); + % fmt::eng(i->second.min).setw().showbase() + % fmt::eng(i->second.avg, i->second.dev).setw().showbase() + % fmt::eng(i->second.max).setw().showbase(); } { Children::const_iterator i (children_.begin()); @@ -136,15 +155,18 @@ prefix_ void senf::StatisticsBase::generateOutput() } } -prefix_ void senf::StatisticsBase::signalChildren() +//-///////////////////////////////////////////////////////////////////////////////////////////////// +// senf::StatisticsBase::OutputEntry + +prefix_ void senf::StatisticsBase::OutputEntry::consoleList(std::ostream & os) { - Children::iterator i (children_.begin()); - Children::iterator const i_end (children_.end()); - for (; i != i_end; ++i) - i->second.enter(min_, avg_, max_, dev_); + for (boost::ptr_vector::iterator i (targets_.begin()); + i != targets_.end(); ++i) + if (! i->label.empty()) + os << i->label << "\n"; } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::Statistics prefix_ senf::Statistics::Statistics() @@ -153,7 +175,7 @@ prefix_ senf::Statistics::Statistics() #endif { #ifndef SENF_DISABLE_CONSOLE - namespace fty = senf::console::factory; + namespace fty = console::factory; dir.add("list", fty::Command(&Statistics::consoleList, this) .doc("List statistics collection intervals and current values.\n" @@ -206,11 +228,12 @@ prefix_ senf::Statistics::Statistics() "the last 5 minutes.") .arg("rank","Rank chain selecting the value to generate output for") .arg("window","Optional size of sliding average window", - senf::console::kw::default_value = 1u) ); + console::kw::default_value = 1u) ); #endif } prefix_ void senf::Statistics::consoleList(std::ostream & os) + const { os << "RANK WIN MIN AVG MAX\n"; StatisticsBase::consoleList(0, os); @@ -263,24 +286,40 @@ prefix_ std::string senf::Statistics::v_path() return ""; } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::Collector -prefix_ void senf::Collector::enter(float min, float avg, float max, float dev) +prefix_ void senf::Collector::enter(unsigned n, float min, float avg, float max, float dev) { - accSum_ += avg; - accSumSq_ += avg*avg + dev*dev; if (min < accMin_) accMin_ = min; if (max > accMax_) accMax_ = max; - if (++i_ >= rank_) { - float accAvg (accSum_ / i_); - float accDev (std::sqrt(std::max(0.0f,accSumSq_ / i_ - accAvg*accAvg))); - StatisticsBase::enter(accMin_, accAvg, accMax_, accDev); - i_ = 0; + + if (i_ + n >= rank_) { + accSum_ += (rank_-i_)*avg; + accSumSq_ += (rank_-i_)*(rank_-i_)*(avg*avg + dev*dev); + float accAvg (accSum_ / rank_); + float accDev (std::sqrt(std::max(0.0f,accSumSq_ / rank_ - accAvg*accAvg))); + StatisticsBase::enter(1, accMin_, accAvg, accMax_, accDev); accMin_ = FLT_MAX; accSum_ = 0.0f; accSumSq_ = 0.0f; accMax_ = -FLT_MAX; + n -= (rank_ - i_); + i_ = 0; + + if (n >= rank_) { + std::div_t d (std::div(int(n), int(rank_))); + StatisticsBase::enter(d.quot, min, avg, max, dev); + n = d.rem; + } + } + + if (n>0) { + accSum_ += n*avg; + accSumSq_ += n*n*(avg*avg+dev*dev); + i_ += n; + if (min < accMin_) accMin_ = min; + if (max > accMax_) accMax_ = max; } } @@ -295,7 +334,7 @@ prefix_ std::string senf::Collector::v_path() return owner_->path() + "-" + senf::str(rank_); } -///////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_ //#include "Statistics.mpp"