diff --git a/gtsam/base/timing.cpp b/gtsam/base/timing.cpp index b43595066..ecff40ebc 100644 --- a/gtsam/base/timing.cpp +++ b/gtsam/base/timing.cpp @@ -106,6 +106,56 @@ void TimingOutline::print(const std::string& outline) const { #endif } +/* ************************************************************************* */ +void TimingOutline::print_csv_header(bool addLineBreak) const { +#ifdef GTSAM_USE_BOOST_FEATURES + // Order is (CPU time, number of times, wall time, time + children in seconds, + // min time, max time) + std::cout << label_ + " cpu time (s)" << "," << label_ + " #calls" << "," + << label_ + " wall time(s)" << "," << label_ + " subtree time (s)" + << "," << label_ + " min time (s)" << "," << label_ + "max time(s)" + << ", "; + // Order children + typedef FastMap > ChildOrder; + ChildOrder childOrder; + for (const ChildMap::value_type& child : children_) { + childOrder[child.second->myOrder_] = child.second; + } + // Print children + for (const ChildOrder::value_type& order_child : childOrder) { + order_child.second->print_csv_header(); + } + if (addLineBreak) { + std::cout << std::endl; + } + std::cout.flush(); +#endif +} + +/* ************************************************************************* */ +void TimingOutline::print_csv(bool addLineBreak) const { +#ifdef GTSAM_USE_BOOST_FEATURES + // Order is (CPU time, number of times, wall time, time + children in seconds, + // min time, max time) + std::cout << self() << "," << n_ << "," << wall() << "," << secs() << "," + << min() << "," << max() << ", "; + // Order children + typedef FastMap > ChildOrder; + ChildOrder childOrder; + for (const ChildMap::value_type& child : children_) { + childOrder[child.second->myOrder_] = child.second; + } + // Print children + for (const ChildOrder::value_type& order_child : childOrder) { + order_child.second->print_csv(false); + } + if (addLineBreak) { + std::cout << std::endl; + } + std::cout.flush(); +#endif +} + void TimingOutline::print2(const std::string& outline, const double parentTotal) const { #ifdef GTSAM_USE_BOOST_FEATURES diff --git a/gtsam/base/timing.h b/gtsam/base/timing.h index 99c55a3d7..dfc2928f1 100644 --- a/gtsam/base/timing.h +++ b/gtsam/base/timing.h @@ -199,6 +199,29 @@ namespace gtsam { #endif GTSAM_EXPORT void print(const std::string& outline = "") const; GTSAM_EXPORT void print2(const std::string& outline = "", const double parentTotal = -1.0) const; + + /** + * @brief Print the CSV header. + * Order is + * (CPU time, number of times, wall time, time + children in seconds, min + * time, max time) + * + * @param addLineBreak Flag indicating if a line break should be added at + * the end. Only used at the top-leve. + */ + GTSAM_EXPORT void print_csv_header(bool addLineBreak = false) const; + + /** + * @brief Print the times recursively from parent to child in CSV format. + * For each timing node, the output is + * (CPU time, number of times, wall time, time + children in seconds, min + * time, max time) + * + * @param addLineBreak Flag indicating if a line break should be added at + * the end. Only used at the top-leve. + */ + GTSAM_EXPORT void print_csv(bool addLineBreak = false) const; + GTSAM_EXPORT const std::shared_ptr& child(size_t child, const std::string& label, const std::weak_ptr& thisPtr); GTSAM_EXPORT void tic(); @@ -268,6 +291,14 @@ inline void tictoc_finishedIteration_() { inline void tictoc_print_() { ::gtsam::internal::gTimingRoot->print(); } +// print timing in CSV format +inline void tictoc_print_csv_(bool displayHeader = false) { + if (displayHeader) { + ::gtsam::internal::gTimingRoot->print_csv_header(true); + } + ::gtsam::internal::gTimingRoot->print_csv(true); +} + // print mean and standard deviation inline void tictoc_print2_() { ::gtsam::internal::gTimingRoot->print2(); }