timer.hh

Go to the documentation of this file.
00001 // timer.hh: this file is part of the Vaucanson project.
00002 //
00003 // Vaucanson, a generic library for finite state machines.
00004 //
00005 // Copyright (C) 2006, 2007 The Vaucanson Group.
00006 //
00007 // This program is free software; you can redistribute it and/or
00008 // modify it under the terms of the GNU General Public License
00009 // as published by the Free Software Foundation; either version 2
00010 // of the License, or (at your option) any later version.
00011 //
00012 // The complete GNU General Public Licence Notice can be found as the
00013 // `COPYING' file in the root directory.
00014 //
00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file.
00016 //
00017 
00018 #ifndef VCSN_MISC_TIMER_HH
00019 # define VCSN_MISC_TIMER_HH
00020 
00256 # include <stack>
00257 # include <map>
00258 # include <list>
00259 # include <string>
00260 # include <iosfwd>
00261 # include <boost/graph/adjacency_list.hpp>
00262 # include <boost/graph/strong_components.hpp>
00263 # include <boost/graph/graphviz.hpp>
00264 
00265 /* Disable this when outside Vaucanson */
00266 # define VAUCANSON 1
00267 
00268 # ifdef VAUCANSON
00269 #  define NAMESPACE_VCSN_BEGIN namespace vcsn {
00270 #  define NAMESPACE_VCSN_END   } // namespace vcsn
00271 #  include <vaucanson/misc/contract.hh>
00272 #  include <vaucanson/misc/timer_internal_gathering.hh>
00273 #  include <vaucanson/misc/timer_internal_graph.hh>
00274 # else
00275 #  define NAMESPACE_VCSN_BEGIN
00276 #  define NAMESPACE_VCSN_END
00277 #  include <cassert>
00278 #  define precondition(C) assert(C)
00279 #  include "timer_internal_gathering.hh"
00280 #  include "timer_internal_graph.hh"
00281 # endif
00282 
00283 NAMESPACE_VCSN_BEGIN
00284 
00285 namespace misc
00286 {
00288   class Timer;
00289 
00291   class ScopedTimer
00292   {
00293   public:
00297     ScopedTimer (Timer& timer, const unsigned int i);
00298 
00303     ScopedTimer (Timer& timer, const std::string& name);
00304 
00307     ~ScopedTimer ();
00308   private:
00309     Timer* timer_;
00310   };
00311 
00312   class Timer
00313   {
00314   public:
00315 
00317     Timer ();
00320     Timer (const Timer& rhs);
00321 
00322     ~Timer ();
00323 
00327     const Timer& operator= (const Timer& rhs);
00328 
00334     unsigned int task (const std::string& name);
00335 
00339     void start ();
00340 
00343     void stop ();
00344 
00347     void clear ();
00348 
00352     std::ostream& print (std::ostream& o,
00353                          timer::verbose_degree vd = timer::VERBOSE_NORMAL)
00354       const;
00355 
00362     std::ostream& export_dot (std::ostream&         o,
00363                               timer::verbose_degree vd = timer::VERBOSE_NORMAL,
00364                               double                ccr = 1) const;
00365 
00370     std::ostream& dump (std::ostream& o) const;
00371 
00375     void push (const std::string& name);
00376 
00377     // Start a sub-timer for a task using its id number (which must
00378     // be declared beforehand).
00380     void push (const unsigned int i);
00381 
00384     void pop (const std::string& task_name);
00385 
00388     void pop (const unsigned int i);
00389 
00392     void pop ();
00393 
00397     bool operator< (const Timer& rhs) const;
00398 
00406     Timer& operator+= (const Timer& rhs);
00407 
00414     Timer operator+ (const Timer& rhs);
00415 
00420     Timer& operator/= (unsigned rhs);
00421 
00426     Timer operator/ (unsigned rhs) const;
00427 
00428   private:
00429     /*------------------------------.
00430     | Timer: Internal structures.   |
00431     `------------------------------*/
00432 
00433     // Graph output writers
00434     friend class timer::GraphWriter;
00435     friend class timer::VertexWriter;
00436     friend class timer::EdgeWriter;
00437 
00438     // Add task vertices and call edges to the graph
00439     void build_output_graph ();
00440     // Build connected component array
00441     void build_connected_components ();
00442 
00443     // Compute task & call times in graph
00444     void compute_output_graph ();
00445     // Compute component times in graph
00446     void compute_connected_components ();
00447 
00448     void print_output_graph (std::ostream& o,
00449                              timer::verbose_degree vd = timer::VERBOSE_NORMAL)
00450       const;
00451 
00452     timer::call_stack           calls_;
00453     timer::task_vector          tasks_;
00454     timer::task_names_map       names_;
00455     timer::TimeStamp            time_;
00456 
00457     timer::output_graph         graph_;
00458     timer::component_id_vector  comp_id_;
00459     timer::component_vector     comp_;
00460     unsigned int                comp_count_;
00461     unsigned int                task_count_;
00462 
00463     bool                        is_running_;
00464 
00465     bool                        cleared_;
00466   };
00467 } // namespace misc
00468 
00469 NAMESPACE_VCSN_END
00470 
00471 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00472 #  ifdef VAUCANSON
00473 #   include <vaucanson/misc/timer_internal_gathering.hxx>
00474 #   include <vaucanson/misc/timer_internal_graph.hxx>
00475 #   include <vaucanson/misc/timer.hxx>
00476 #   include <vaucanson/misc/timer_internal_gathering.cc>
00477 #   include <vaucanson/misc/timer_internal_graph.cc>
00478 #   include <vaucanson/misc/timer.cc>
00479 #  else
00480 #   include "timer_internal_gathering.hxx"
00481 #   include "timer_internal_graph.hxx"
00482 #   include "timer.hxx"
00483 #  endif
00484 # endif // !VCSN_USE_INTERFACE_ONLY
00485 
00486 #endif // !VCSN_MISC_TIMER_HH

Generated on Thu Dec 13 16:03:01 2007 for Vaucanson by  doxygen 1.5.4