diff options
author | Yoshitaka Aharen <aharen@jprs.co.jp> | 2012-09-28 12:03:52 +0200 |
---|---|---|
committer | Yoshitaka Aharen <aharen@jprs.co.jp> | 2012-09-28 12:45:25 +0200 |
commit | c76e3fc072e8b1b771b55b6547889863ba263f31 (patch) | |
tree | 9ae9143c05cd8a3329a4ca5fb1d4f1a9c08f090e /src/lib/statistics | |
parent | [2154] add statistics_items.h and test code (diff) | |
download | kea-c76e3fc072e8b1b771b55b6547889863ba263f31.tar.xz kea-c76e3fc072e8b1b771b55b6547889863ba263f31.zip |
[2155] inlining isc::statistics::Counter
make isc::statistics::Counter and isc::statistics::CounterDict
inline for performance
Diffstat (limited to 'src/lib/statistics')
-rw-r--r-- | src/lib/statistics/Makefile.am | 6 | ||||
-rw-r--r-- | src/lib/statistics/counter.cc | 82 | ||||
-rw-r--r-- | src/lib/statistics/counter.h | 54 | ||||
-rw-r--r-- | src/lib/statistics/counter_dict.cc | 265 | ||||
-rw-r--r-- | src/lib/statistics/counter_dict.h | 202 | ||||
-rw-r--r-- | src/lib/statistics/tests/Makefile.am | 1 |
6 files changed, 167 insertions, 443 deletions
diff --git a/src/lib/statistics/Makefile.am b/src/lib/statistics/Makefile.am index 206b527988..e3543a29a8 100644 --- a/src/lib/statistics/Makefile.am +++ b/src/lib/statistics/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = . tests +SUBDIRS = tests AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib AM_CPPFLAGS += $(BOOST_INCLUDES) $(MULTITHREADING_FLAG) @@ -17,8 +17,4 @@ if USE_CLANGPP AM_CXXFLAGS += -Wno-unused-parameter endif -lib_LTLIBRARIES = libb10-statistics.la -libb10_statistics_la_SOURCES = counter.h counter.cc -libb10_statistics_la_SOURCES += counter_dict.h counter_dict.cc - CLEANFILES = *.gcno *.gcda diff --git a/src/lib/statistics/counter.cc b/src/lib/statistics/counter.cc deleted file mode 100644 index 53dc58e862..0000000000 --- a/src/lib/statistics/counter.cc +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH -// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, -// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -// PERFORMANCE OF THIS SOFTWARE. - -#include <vector> - -#include <boost/noncopyable.hpp> - -#include <statistics/counter.h> - -namespace { -const unsigned int InitialValue = 0; -} // namespace - -namespace isc { -namespace statistics { - -class CounterImpl : boost::noncopyable { - private: - std::vector<Counter::Value> counters_; - public: - CounterImpl(const size_t nelements); - ~CounterImpl(); - void inc(const Counter::Type&); - const Counter::Value& get(const Counter::Type&) const; -}; - -CounterImpl::CounterImpl(const size_t items) : - counters_(items, InitialValue) -{ - if (items == 0) { - isc_throw(isc::InvalidParameter, "Items must not be 0"); - } -} - -CounterImpl::~CounterImpl() {} - -void -CounterImpl::inc(const Counter::Type& type) { - if(type >= counters_.size()) { - isc_throw(isc::OutOfRange, "Counter type is out of range"); - } - ++counters_.at(type); - return; -} - -const Counter::Value& -CounterImpl::get(const Counter::Type& type) const { - if(type >= counters_.size()) { - isc_throw(isc::OutOfRange, "Counter type is out of range"); - } - return (counters_.at(type)); -} - -Counter::Counter(const size_t items) : impl_(new CounterImpl(items)) -{} - -Counter::~Counter() {} - -void -Counter::inc(const Type& type) { - impl_->inc(type); - return; -} - -const Counter::Value& -Counter::get(const Type& type) const { - return (impl_->get(type)); -} - -} // namespace statistics -} // namespace isc diff --git a/src/lib/statistics/counter.h b/src/lib/statistics/counter.h index 9e467ce9c3..ed5c276060 100644 --- a/src/lib/statistics/counter.h +++ b/src/lib/statistics/counter.h @@ -15,24 +15,29 @@ #ifndef __COUNTER_H #define __COUNTER_H 1 +#include <exceptions/exceptions.h> + #include <boost/noncopyable.hpp> #include <boost/scoped_ptr.hpp> -#include <exceptions/exceptions.h> +#include <vector> + +namespace { +const unsigned int InitialValue = 0; +} // anonymous namespace namespace isc { namespace statistics { -// forward declaration for pImpl idiom -class CounterImpl; - class Counter : boost::noncopyable { -private: - boost::scoped_ptr<CounterImpl> impl_; public: typedef unsigned int Type; typedef unsigned int Value; +private: + std::vector<Counter::Value> counters_; + +public: /// The constructor. /// /// This constructor is mostly exception free. But it may still throw @@ -41,29 +46,56 @@ public: /// \param items A number of counter items to hold (greater than 0) /// /// \throw isc::InvalidParameter \a items is 0 - Counter(const size_t items); + explicit inline Counter(const size_t items); /// The destructor. /// /// This method never throws an exception. - ~Counter(); + inline ~Counter(); /// \brief Increment a counter item specified with \a type. /// /// \param type %Counter item to increment /// /// \throw isc::OutOfRange \a type is invalid - void inc(const Type& type); + inline void inc(const Counter::Type); /// \brief Get the value of a counter item specified with \a type. /// /// \param type %Counter item to get the value of /// /// \throw isc::OutOfRange \a type is invalid - const Value& get(const Type& type) const; + inline const Counter::Value& get(const Counter::Type) const; }; +inline Counter::Counter(const size_t items) : + counters_(items, InitialValue) +{ + if (items == 0) { + isc_throw(isc::InvalidParameter, "Items must not be 0"); + } +} + +inline Counter::~Counter() {} + +inline void +Counter::inc(const Counter::Type type) { + if(type >= counters_.size()) { + isc_throw(isc::OutOfRange, "Counter type is out of range"); + } + ++counters_.at(type); + return; +} + +inline const Counter::Value& +Counter::get(const Counter::Type type) const { + if(type >= counters_.size()) { + isc_throw(isc::OutOfRange, "Counter type is out of range"); + } + return (counters_.at(type)); +} + } // namespace statistics } // namespace isc -#endif +#endif // __COUNTER_H diff --git a/src/lib/statistics/counter_dict.cc b/src/lib/statistics/counter_dict.cc deleted file mode 100644 index 55353b29b9..0000000000 --- a/src/lib/statistics/counter_dict.cc +++ /dev/null @@ -1,265 +0,0 @@ -// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC") -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH -// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, -// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE -// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -// PERFORMANCE OF THIS SOFTWARE. - -#include <cassert> -#include <stdexcept> -#include <iterator> -#include <map> -#include <boost/noncopyable.hpp> -#include <boost/shared_ptr.hpp> - -#include <statistics/counter_dict.h> - -namespace { -typedef boost::shared_ptr<isc::statistics::Counter> CounterPtr; -typedef std::map<std::string, CounterPtr> DictionaryMap; -} - -namespace isc { -namespace statistics { - -// Implementation detail class for CounterDictionary::ConstIterator -class CounterDictionaryConstIteratorImpl; - -class CounterDictionaryImpl : boost::noncopyable { -private: - DictionaryMap dictionary_; - std::vector<std::string> elements_; - const size_t items_; - // Default constructor is forbidden; number of counter items must be - // specified at the construction of this class. - CounterDictionaryImpl(); -public: - CounterDictionaryImpl(const size_t items); - ~CounterDictionaryImpl(); - void addElement(const std::string& name); - void deleteElement(const std::string& name); - Counter& getElement(const std::string& name); -public: - CounterDictionaryConstIteratorImpl begin() const; - CounterDictionaryConstIteratorImpl end() const; -}; - -// Constructor with number of items -CounterDictionaryImpl::CounterDictionaryImpl(const size_t items) : - items_(items) -{ - // The number of items must not be 0 - if (items == 0) { - isc_throw(isc::InvalidParameter, "Items must not be 0"); - } -} - -// Destructor -CounterDictionaryImpl::~CounterDictionaryImpl() {} - -void -CounterDictionaryImpl::addElement(const std::string& name) { - // throw if the element already exists - if (dictionary_.count(name) != 0) { - isc_throw(isc::InvalidParameter, - "Element " << name << " already exists"); - } - assert(items_ != 0); - // Create a new Counter and add to the map - dictionary_.insert( - DictionaryMap::value_type(name, CounterPtr(new Counter(items_)))); -} - -void -CounterDictionaryImpl::deleteElement(const std::string& name) { - size_t result = dictionary_.erase(name); - if (result != 1) { - // If an element with specified name does not exist, throw - // isc::OutOfRange. - isc_throw(isc::OutOfRange, "Element " << name << " does not exist"); - } -} - -Counter& -CounterDictionaryImpl::getElement(const std::string& name) { - DictionaryMap::const_iterator i = dictionary_.find(name); - if (i != dictionary_.end()) { - // the key was found. return the element. - return (*(i->second)); - } else { - // If an element with specified name does not exist, throw - // isc::OutOfRange. - isc_throw(isc::OutOfRange, "Element " << name << " does not exist"); - } -} - -// Constructor -// Initialize impl_ -CounterDictionary::CounterDictionary(const size_t items) : - impl_(new CounterDictionaryImpl(items)) -{} - -// Destructor -// impl_ will be freed automatically with scoped_ptr -CounterDictionary::~CounterDictionary() {} - -void -CounterDictionary::addElement(const std::string& name) { - impl_->addElement(name); -} - -void -CounterDictionary::deleteElement(const std::string& name) { - impl_->deleteElement(name); -} - -Counter& -CounterDictionary::getElement(const std::string& name) const { - return (impl_->getElement(name)); -} - -Counter& -CounterDictionary::operator[](const std::string& name) const { - return (impl_->getElement(name)); -} - -// Implementation detail class for CounterDictionary::ConstIterator -class CounterDictionaryConstIteratorImpl { - public: - CounterDictionaryConstIteratorImpl(); - ~CounterDictionaryConstIteratorImpl(); - CounterDictionaryConstIteratorImpl( - const CounterDictionaryConstIteratorImpl &other); - CounterDictionaryConstIteratorImpl &operator=( - const CounterDictionaryConstIteratorImpl &source); - CounterDictionaryConstIteratorImpl( - DictionaryMap::const_iterator iterator); - public: - void increment(); - const CounterDictionary::ConstIterator::value_type& - dereference() const; - bool equal(const CounterDictionaryConstIteratorImpl& other) const; - private: - DictionaryMap::const_iterator iterator_; -}; - -CounterDictionaryConstIteratorImpl::CounterDictionaryConstIteratorImpl() {} - -CounterDictionaryConstIteratorImpl::~CounterDictionaryConstIteratorImpl() {} - -// Copy constructor: deep copy of iterator_ -CounterDictionaryConstIteratorImpl::CounterDictionaryConstIteratorImpl( - const CounterDictionaryConstIteratorImpl &other) : - iterator_(other.iterator_) -{} - -// Assignment operator: deep copy of iterator_ -CounterDictionaryConstIteratorImpl & -CounterDictionaryConstIteratorImpl::operator=( - const CounterDictionaryConstIteratorImpl &source) -{ - iterator_ = source.iterator_; - return (*this); -} - -// Constructor from implementation detail DictionaryMap::const_iterator -CounterDictionaryConstIteratorImpl::CounterDictionaryConstIteratorImpl( - DictionaryMap::const_iterator iterator) : - iterator_(iterator) -{} - -CounterDictionaryConstIteratorImpl -CounterDictionaryImpl::begin() const { - return (CounterDictionaryConstIteratorImpl(dictionary_.begin())); -} - -CounterDictionaryConstIteratorImpl -CounterDictionaryImpl::end() const { - return (CounterDictionaryConstIteratorImpl(dictionary_.end())); -} - -void -CounterDictionaryConstIteratorImpl::increment() { - ++iterator_; - return; -} - -const CounterDictionary::ConstIterator::value_type& -CounterDictionaryConstIteratorImpl::dereference() const { - return (iterator_->first); -} - -bool -CounterDictionaryConstIteratorImpl::equal( - const CounterDictionaryConstIteratorImpl& other) const -{ - return (iterator_ == other.iterator_); -} - -CounterDictionary::ConstIterator -CounterDictionary::begin() const { - return (CounterDictionary::ConstIterator( - CounterDictionaryConstIteratorImpl(impl_->begin()))); -} - -CounterDictionary::ConstIterator -CounterDictionary::end() const { - return (CounterDictionary::ConstIterator( - CounterDictionaryConstIteratorImpl(impl_->end()))); -} - -CounterDictionary::ConstIterator::ConstIterator() : - impl_(new CounterDictionaryConstIteratorImpl()) -{} - -CounterDictionary::ConstIterator::~ConstIterator() {} - -// Copy constructor: deep copy of impl_ -CounterDictionary::ConstIterator::ConstIterator( - const CounterDictionary::ConstIterator& source) : - impl_(new CounterDictionaryConstIteratorImpl(*(source.impl_))) -{} - -// Assignment operator: deep copy of impl_ -CounterDictionary::ConstIterator & -CounterDictionary::ConstIterator::operator=( - const CounterDictionary::ConstIterator &source) -{ - *impl_ = *source.impl_; - return (*this); -} - -// The constructor from implementation detail -CounterDictionary::ConstIterator::ConstIterator( - const CounterDictionaryConstIteratorImpl& source) : - impl_(new CounterDictionaryConstIteratorImpl(source)) -{} - -const CounterDictionary::ConstIterator::value_type& -CounterDictionary::ConstIterator::dereference() const -{ - return (impl_->dereference()); -} - -bool -CounterDictionary::ConstIterator::equal( - CounterDictionary::ConstIterator const& other) const -{ - return (impl_->equal(*(other.impl_))); -} - -void -CounterDictionary::ConstIterator::increment() { - impl_->increment(); - return; -} - -} // namespace statistics -} // namespace isc diff --git a/src/lib/statistics/counter_dict.h b/src/lib/statistics/counter_dict.h index e32211990e..3715fc298e 100644 --- a/src/lib/statistics/counter_dict.h +++ b/src/lib/statistics/counter_dict.h @@ -15,67 +15,45 @@ #ifndef __COUNTER_DICT_H #define __COUNTER_DICT_H 1 -#include <string> -#include <vector> -#include <utility> +#include <statistics/counter.h> +#include <exceptions/exceptions.h> + #include <boost/noncopyable.hpp> #include <boost/scoped_ptr.hpp> +#include <boost/shared_ptr.hpp> #include <boost/iterator/iterator_facade.hpp> -#include <exceptions/exceptions.h> -#include <statistics/counter.h> +#include <cassert> +#include <stdexcept> +#include <string> +#include <vector> +#include <map> +#include <iterator> +#include <utility> + +namespace { +typedef boost::shared_ptr<isc::statistics::Counter> CounterPtr; +typedef std::map<std::string, CounterPtr> DictionaryMap; +} namespace isc { namespace statistics { -class CounterDictionaryImpl; -class CounterDictionaryConstIteratorImpl; - class CounterDictionary : boost::noncopyable { private: - boost::scoped_ptr<CounterDictionaryImpl> impl_; + DictionaryMap dictionary_; + std::vector<std::string> elements_; + const size_t items_; // Default constructor is forbidden; number of counter items must be // specified at the construction of this class. CounterDictionary(); public: - /// The constructor. - /// This constructor is mostly exception free. But it may still throw - /// a standard exception if memory allocation fails inside the method. - /// - /// \param items A number of counter items to hold (greater than 0) - /// - /// \throw isc::InvalidParameter \a items is 0 - CounterDictionary(const size_t items); - - /// The destructor. - /// - /// This method never throws an exception. - ~CounterDictionary(); - - /// \brief Add an element - /// - /// \throw isc::InvalidParameter \a element already exists. - /// - /// \param name A name of the element to append - void addElement(const std::string& name); - - /// \brief Delete - /// - /// \throw isc::OutOfRange \a element does not exist. - /// - /// \param name A name of the element to delete - void deleteElement(const std::string& name); - - /// \brief Lookup - /// - /// \throw isc::OutOfRange \a element does not exist. - /// - /// \param name A name of the element to get the counters - Counter& getElement(const std::string &name) const; - - /// Same as getElement() - Counter& operator[](const std::string &name) const; - + explicit inline CounterDictionary(const size_t items); + inline ~CounterDictionary(); + inline void addElement(const std::string& name); + inline void deleteElement(const std::string& name); + inline Counter& getElement(const std::string& name); + inline Counter& operator[](const std::string& name); /// \brief \c ConstIterator is a constant iterator that provides an /// interface for enumerating name of zones stored in CounterDictionary. /// @@ -90,68 +68,134 @@ public: const std::string, boost::forward_traversal_tag> { - private: - boost::scoped_ptr<CounterDictionaryConstIteratorImpl> impl_; public: /// The constructor. /// /// This constructor is mostly exception free. But it may still /// throw a standard exception if memory allocation fails /// inside the method. - ConstIterator(); + inline ConstIterator() {} /// The destructor. /// /// This method never throws an exception. - ~ConstIterator(); + inline ~ConstIterator() {} /// The assignment operator. /// /// This method is mostly exception free. But it may still /// throw a standard exception if memory allocation fails /// inside the method. - ConstIterator& operator=(const ConstIterator &source); + inline ConstIterator& operator=(const ConstIterator& source) { + iterator_ = source.iterator_; + return (*this); + } + /// The copy constructor. /// /// This constructor is mostly exception free. But it may still /// throw a standard exception if memory allocation fails /// inside the method. - ConstIterator(const ConstIterator& source); - /// The constructor from implementation detail. - /// - /// This method is used to create an instance of ConstIterator - /// by CounterDict::begin() and CounterDict::end(). - /// - /// This constructor is mostly exception free. But it may still - /// throw a standard exception if memory allocation fails - /// inside the method. - ConstIterator( - const CounterDictionaryConstIteratorImpl& source); + inline ConstIterator(const ConstIterator& source) : + iterator_(source.iterator_) + {} + // + // Constructor from implementation detail DictionaryMap::const_iterator + inline ConstIterator( + DictionaryMap::const_iterator iterator) : + iterator_(iterator) + {} + private: /// \brief An internal method to increment this iterator. - void increment(); + inline void increment() { + ++iterator_; + return; + } + /// \brief An internal method to check equality. - bool equal(const ConstIterator& other) const; + inline bool equal(const ConstIterator& other) const { + return (iterator_ == other.iterator_); + } + /// \brief An internal method to dereference this iterator. - const value_type& dereference() const; + inline const value_type& dereference() const { + return (iterator_->first); + } + private: friend class boost::iterator_core_access; + DictionaryMap::const_iterator iterator_; }; + inline ConstIterator begin() const; + inline ConstIterator end() const; + typedef ConstIterator const_iterator; +}; - /// \brief Return an iterator corresponding to the beginning of the - /// elements stored in CounterDictionary. - /// - /// This method is mostly exception free. But it may still throw a - /// standard exception if memory allocation fails inside the method. - const_iterator begin() const; - /// \brief Return an iterator corresponding to the end of the elements - /// stored in CounterDictionary. - /// - /// This method is mostly exception free. But it may still throw a - /// standard exception if memory allocation fails inside the method. - const_iterator end() const; -}; +inline CounterDictionary::ConstIterator +CounterDictionary::begin() const { + return (CounterDictionary::ConstIterator(dictionary_.begin())); +} + +inline CounterDictionary::ConstIterator +CounterDictionary::end() const { + return (CounterDictionary::ConstIterator(dictionary_.end())); +} + +// Constructor with number of items +inline CounterDictionary::CounterDictionary(const size_t items) : + items_(items) +{ + // The number of items must not be 0 + if (items == 0) { + isc_throw(isc::InvalidParameter, "Items must not be 0"); + } +} + +// Destructor +inline CounterDictionary::~CounterDictionary() {} + +inline void +CounterDictionary::addElement(const std::string& name) { + // throw if the element already exists + if (dictionary_.count(name) != 0) { + isc_throw(isc::InvalidParameter, + "Element " << name << " already exists"); + } + assert(items_ != 0); + // Create a new Counter and add to the map + dictionary_.insert( + DictionaryMap::value_type(name, CounterPtr(new Counter(items_)))); +} + +inline void +CounterDictionary::deleteElement(const std::string& name) { + size_t result = dictionary_.erase(name); + if (result != 1) { + // If an element with specified name does not exist, throw + // isc::OutOfRange. + isc_throw(isc::OutOfRange, "Element " << name << " does not exist"); + } +} + +inline Counter& +CounterDictionary::getElement(const std::string& name) { + DictionaryMap::const_iterator i = dictionary_.find(name); + if (i != dictionary_.end()) { + // the key was found. return the element. + return (*(i->second)); + } else { + // If an element with specified name does not exist, throw + // isc::OutOfRange. + isc_throw(isc::OutOfRange, "Element " << name << " does not exist"); + } +} + +inline Counter& +CounterDictionary::operator[](const std::string& name) { + return (getElement(name)); +} } // namespace statistics } // namespace isc diff --git a/src/lib/statistics/tests/Makefile.am b/src/lib/statistics/tests/Makefile.am index 007c8b04fd..25a3db2c66 100644 --- a/src/lib/statistics/tests/Makefile.am +++ b/src/lib/statistics/tests/Makefile.am @@ -28,7 +28,6 @@ run_unittests_SOURCES += counter_dict_unittest.cc run_unittests_CPPFLAGS = $(AM_CPPFLAGS) $(GTEST_INCLUDES) run_unittests_LDADD = $(GTEST_LDADD) -run_unittests_LDADD += $(top_builddir)/src/lib/statistics/libb10-statistics.la run_unittests_LDADD += $(top_builddir)/src/lib/log/libb10-log.la run_unittests_LDADD += $(top_builddir)/src/lib/util/unittests/libutil_unittests.la run_unittests_LDADD += $(top_builddir)/src/lib/exceptions/libb10-exceptions.la |