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