From 0476ae48be49690ef188701d3a4624e12ad1ec5a Mon Sep 17 00:00:00 2001 From: Raphael <ufdrv@student.kit.edu> Date: Thu, 15 Jun 2017 16:05:03 +0200 Subject: [PATCH] move and rename the time measurement macro (RobotUnit.cpp -> util.h) ( ARMARX_[VIRTUAL_]TIMER -> ARMARX_[VIRTUAL_]STOPWATCH ) --- .../components/units/RobotUnit/RobotUnit.cpp | 103 ++---------------- .../components/units/RobotUnit/util.h | 86 +++++++++++++++ 2 files changed, 95 insertions(+), 94 deletions(-) diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnit.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnit.cpp index d67a5fecd..5749f4e02 100644 --- a/source/RobotAPI/components/units/RobotUnit/RobotUnit.cpp +++ b/source/RobotAPI/components/units/RobotUnit/RobotUnit.cpp @@ -38,91 +38,6 @@ #include "Units/KinematicSubUnit.h" #include "Units/PlatformSubUnit.h" - -namespace armarx -{ - namespace detail - { - template<class TimeT = std::chrono::microseconds> - struct TimerTag - { - //assume it is std::chrono - - using ClockT = std::chrono::high_resolution_clock; - const ClockT::time_point beg; - - TimerTag() : beg {ClockT::now()} {} - - TimeT stop() - { - return std::chrono::duration_cast<TimeT>(ClockT::now() - beg); - } - }; - - template<> - struct TimerTag<TimestampVariant> : TimerTag<> - { - TimestampVariant stop() - { - return {TimerTag<std::chrono::microseconds>::stop().count()}; - } - }; - - template<> - struct TimerTag<IceUtil::Time> : TimerTag<> - { - TimestampVariant stop() - { - return IceUtil::Time::microSeconds(TimerTag<std::chrono::microseconds>::stop().count()); - } - }; - - template <class Fun, class TimeT> - TimeT operator*(TimerTag<TimeT>&& t, Fun&& fn) - { - fn(); - return t.stop(); - } - - //for virtual time - - template<class TimeT = IceUtil::Time> - struct VirtualTimerTag; - - template<> - struct VirtualTimerTag<TimestampVariant> - { - const IceUtil::Time beg; - VirtualTimerTag() : beg {TimeUtil::GetTime()} {} - TimestampVariant stop() - { - return {TimeUtil::GetTime() - beg}; - } - }; - - template<> - struct VirtualTimerTag<IceUtil::Time> - { - const IceUtil::Time beg; - VirtualTimerTag() : beg {TimeUtil::GetTime()} {} - TimestampVariant stop() - { - return TimeUtil::GetTime() - beg; - } - }; - - template <class Fun, class TimeT> - TimeT operator*(VirtualTimerTag<TimeT>&& t, Fun&& fn) - { - fn(); - return t.stop(); - } - } -} -#define ARMARX_TIMER(...) ::armarx::detail::TimerTag<__VA_ARGS__>{} *[&] -#define ARMARX_VIRTUAL_TIMER(...) ::armarx::detail::VirtualTimerTag<__VA_ARGS__>{} *[&] - - namespace std { std::string to_string(armarx::RobotUnitState s) @@ -1226,7 +1141,7 @@ namespace armarx //update units debugObserverMap["publishTimings_UnitUpdate"] = new TimedVariant { - ARMARX_TIMER(TimestampVariant) + ARMARX_STOPWATCH(TimestampVariant) { ARMARX_DEBUG << deactivateSpam(spamdelay) << "updating units with new sensor values"; publishNewSensorDataTime = TimeUtil::GetTime(); @@ -1236,7 +1151,7 @@ namespace armarx { debugObserverMap["publishTimings_UnitUpdate_" + rsu->getName()] = new TimedVariant { - ARMARX_TIMER(TimestampVariant){rsu->update(sensorAndControlBuffer, activatedControllers);}, + ARMARX_STOPWATCH(TimestampVariant){rsu->update(sensorAndControlBuffer, activatedControllers);}, timestamp }; } @@ -1248,7 +1163,7 @@ namespace armarx debugObserverMap["publishTimings_SensorUpdates"] = new TimedVariant { - ARMARX_TIMER(TimestampVariant) + ARMARX_STOPWATCH(TimestampVariant) { for (std::size_t sensidx = 0 ; sensidx < numSensorDevices; ++sensidx) { @@ -1288,7 +1203,7 @@ namespace armarx { debugObserverMap["publishTimings_ControlUpdates"] = new TimedVariant { - ARMARX_TIMER(TimestampVariant) + ARMARX_STOPWATCH(TimestampVariant) { for (std::size_t ctrlidx = 0 ; ctrlidx < numControlDevices; ++ctrlidx) { @@ -1329,14 +1244,14 @@ namespace armarx //call publish hook + publish LVL1Controller changes debugObserverMap["publishTimings_LVL1Updates"] = new TimedVariant { - ARMARX_TIMER(TimestampVariant) + ARMARX_STOPWATCH(TimestampVariant) { for (const auto& pair : lvl1Controllers) { const LVL1ControllerPtr& lvl1 = pair.second; debugObserverMap["publishTimings_LVL1Updates_" + lvl1->getInstanceName()] = new TimedVariant { - ARMARX_TIMER(TimestampVariant) + ARMARX_STOPWATCH(TimestampVariant) { //run some hook for active (used for visu) PublishLVL1Controller(lvl1, sensorAndControlBuffer, debugDrawerPrx, debugObserverBatchPrx); @@ -1359,7 +1274,7 @@ namespace armarx //report new class names debugObserverMap["publishTimings_ClassNameUpdates"] = new TimedVariant { - ARMARX_TIMER(TimestampVariant) + ARMARX_STOPWATCH(TimestampVariant) { const auto classNames = LVL1ControllerRegistry::getKeys(); if (lastReportedClasses.size() != classNames.size()) @@ -1376,14 +1291,14 @@ namespace armarx }, timestamp }; - debugObserverMap["publishTimings_RobotUnitListenerFlush"] = new TimedVariant {ARMARX_TIMER(TimestampVariant){listenerBatchPrx->ice_flushBatchRequests();}, timestamp}; + debugObserverMap["publishTimings_RobotUnitListenerFlush"] = new TimedVariant {ARMARX_STOPWATCH(TimestampVariant){listenerBatchPrx->ice_flushBatchRequests();}, timestamp}; if (publishDebugObserver) { debugObserverMap["publishTimings_LastDebugObserverFlush"] = new TimedVariant {TimestampVariant{lastDebugObserverFlush.count()}, timestamp}; debugObserverMap["publishTimings_LastPublishLoop"] = new TimedVariant {TimestampVariant{lastPublishLoop.count()}, timestamp}; debugObserverBatchPrx->setDebugChannel(getName(), debugObserverMap); - lastDebugObserverFlush = ARMARX_TIMER() + lastDebugObserverFlush = ARMARX_STOPWATCH() { debugObserverBatchPrx->ice_flushBatchRequests(); }; diff --git a/source/RobotAPI/components/units/RobotUnit/util.h b/source/RobotAPI/components/units/RobotUnit/util.h index da93e8a7d..3e32ce7d4 100644 --- a/source/RobotAPI/components/units/RobotUnit/util.h +++ b/source/RobotAPI/components/units/RobotUnit/util.h @@ -23,6 +23,92 @@ #ifndef _ARMARX_UNIT_RobotAPI_RobotUnit_util_H #define _ARMARX_UNIT_RobotAPI_RobotUnit_util_H +#include <chrono> +#include <ArmarXCore/core/time/TimeUtil.h> +#include <ArmarXCore/observers/variant/TimestampVariant.h> +namespace armarx +{ + namespace detail + { + template<class TimeT = std::chrono::microseconds> + struct TimerTag + { + //assume it is std::chrono + + using ClockT = std::chrono::high_resolution_clock; + const ClockT::time_point beg; + + TimerTag() : beg {ClockT::now()} {} + + TimeT stop() + { + return std::chrono::duration_cast<TimeT>(ClockT::now() - beg); + } + }; + + template<> + struct TimerTag<TimestampVariant> : TimerTag<> + { + TimestampVariant stop() + { + return {TimerTag<std::chrono::microseconds>::stop().count()}; + } + }; + + template<> + struct TimerTag<IceUtil::Time> : TimerTag<> + { + TimestampVariant stop() + { + return IceUtil::Time::microSeconds(TimerTag<std::chrono::microseconds>::stop().count()); + } + }; + + template <class Fun, class TimeT> + TimeT operator*(TimerTag<TimeT>&& t, Fun&& fn) + { + fn(); + return t.stop(); + } + + //for virtual time + + template<class TimeT = IceUtil::Time> + struct VirtualTimerTag; + + template<> + struct VirtualTimerTag<TimestampVariant> + { + const IceUtil::Time beg; + VirtualTimerTag() : beg {TimeUtil::GetTime()} {} + TimestampVariant stop() + { + return {TimeUtil::GetTime() - beg}; + } + }; + + template<> + struct VirtualTimerTag<IceUtil::Time> + { + const IceUtil::Time beg; + VirtualTimerTag() : beg {TimeUtil::GetTime()} {} + TimestampVariant stop() + { + return TimeUtil::GetTime() - beg; + } + }; + + template <class Fun, class TimeT> + TimeT operator*(VirtualTimerTag<TimeT>&& t, Fun&& fn) + { + fn(); + return t.stop(); + } + } +} +#define ARMARX_STOPWATCH(...) ::armarx::detail::TimerTag<__VA_ARGS__>{} *[&] +#define ARMARX_VIRTUAL_STOPWATCH(...) ::armarx::detail::VirtualTimerTag<__VA_ARGS__>{} *[&] + #include <boost/units/detail/utility.hpp> #include <string> namespace armarx -- GitLab