42 virtual void set_up(
size_t num_workers) = 0;
126 inline void set_up(
size_t num_workers)
override final;
127 inline void on_entry(
size_t worker_id,
TaskView task_view)
override final;
128 inline void on_exit(
size_t worker_id,
TaskView task_view)
override final;
134 inline ChromeTracingObserver::Segment::Segment(
142 inline ChromeTracingObserver::Segment::Segment(
147 name {n}, beg {b},
end {e} {
151 inline void ChromeTracingObserver::set_up(
size_t num_workers) {
153 _timeline.segments.resize(num_workers);
155 for(
size_t w=0; w<num_workers; ++w) {
156 _timeline.segments[w].reserve(32);
163 inline void ChromeTracingObserver::on_entry(
size_t w, TaskView tv) {
164 _timeline.segments[w].emplace_back(
170 inline void ChromeTracingObserver::on_exit(
size_t w, TaskView) {
171 assert(_timeline.segments[w].size() > 0);
177 for(
size_t w=0; w<_timeline.segments.size(); ++w) {
178 _timeline.segments[w].clear();
187 for(first = 0; first<_timeline.segments.size(); ++first) {
188 if(_timeline.segments[first].size() > 0) {
195 for(
size_t w=first; w<_timeline.segments.size(); w++) {
197 if(w != first && _timeline.segments[w].size() > 0) {
201 for(
size_t i=0; i<_timeline.segments[w].size(); i++) {
204 <<
"\"cat\":\"ChromeTracingObserver\",";
208 if(_timeline.segments[w][i].name.empty()) {
212 os << _timeline.segments[w][i].name;
217 os <<
"\"ph\":\"X\"," 219 <<
"\"tid\":" << w <<
',' 221 _timeline.segments[w][i].beg - _timeline.origin
224 _timeline.segments[w][i].end - _timeline.segments[w][i].beg
227 if(i != _timeline.segments[w].size() - 1) {
247 return std::accumulate(
248 _timeline.segments.begin(), _timeline.segments.end(),
size_t{0},
249 [](
size_t sum,
const auto& exe){
250 return sum + exe.size();
325 inline void set_up(
size_t num_workers)
override final;
326 inline void on_entry(
size_t worker_id,
TaskView task_view)
override final;
327 inline void on_exit(
size_t worker_id,
TaskView task_view)
override final;
335 inline TFProfObserver::Segment::Segment(
340 name {n}, type {t}, beg {b} {
344 inline TFProfObserver::Segment::Segment(
350 name {n}, type {t}, beg {b},
end {e} {
354 inline void TFProfObserver::set_up(
size_t num_workers) {
356 _timeline.segments.resize(num_workers);
358 for(
size_t w=0; w<num_workers; ++w) {
359 _timeline.segments[w].reserve(32);
366 inline void TFProfObserver::on_entry(
size_t w, TaskView tv) {
367 _timeline.segments[w].emplace_back(
373 inline void TFProfObserver::on_exit(
size_t w, TaskView) {
374 assert(_timeline.segments[w].size() > 0);
380 for(
size_t w=0; w<_timeline.segments.size(); ++w) {
381 _timeline.segments[w].clear();
390 for(first = 0; first<_timeline.segments.size(); ++first) {
391 if(_timeline.segments[first].size() > 0) {
397 if(first == _timeline.segments.size()) {
402 os <<
"{\"executor\":\"" << _uuid <<
"\",\"data\":[";
404 for(
size_t w=first; w<_timeline.segments.size(); w++) {
406 if(_timeline.segments[w].empty()) {
414 os <<
"{\"worker\":\"worker " << w <<
"\",\"data\":[";
415 for(
size_t i=0; i<_timeline.segments[w].size(); ++i) {
417 const auto& s = _timeline.segments[w][i];
424 s.beg - _timeline.origin
427 s.end - _timeline.origin
441 os <<
"\"type\":\"" << task_type_to_string(s.type) <<
"\"";
460 return std::accumulate(
461 _timeline.segments.begin(), _timeline.segments.end(),
size_t{0},
462 [](
size_t sum,
const auto& exe){
463 return sum + exe.size();
485 inline const char* observer_type_to_string(ObserverType type) {
488 case TFPROF: val =
"TFProf";
break;
489 case CHROME: val =
"Chrome";
break;
490 default: val =
"undefined";
break;
498 using ExecutorObserverInterface = ObserverInterface;
499 using ExecutorObserver = ChromeTracingObserver;
size_t num_tasks() const
get the number of total tasks in the observer
Definition: observer.hpp:246
void clear()
clear the timeline data
Definition: observer.hpp:379
virtual void on_entry(size_t worker_id, TaskView task_view)=0
method to call before a worker thread executes a closure
std::string dump() const
dump the timelines in JSON to a std::string
Definition: observer.hpp:452
T duration_cast(T... args)
observer designed based on taskflow board format
Definition: observer.hpp:265
virtual void on_exit(size_t worker_id, TaskView task_view)=0
method to call after a worker thread executed a closure
virtual void set_up(size_t num_workers)=0
constructor-like method to call when the executor observer is fully created
class to access task information from the observer interface
Definition: task.hpp:529
observer designed based on chrome tracing format
Definition: observer.hpp:69
std::string dump() const
dump the timelines in JSON to a std::string
Definition: observer.hpp:239
void clear()
clear the timeline data
Definition: observer.hpp:176
size_t num_tasks() const
get the number of total tasks in the observer
Definition: observer.hpp:459
execution interface for running a taskflow graph
Definition: executor.hpp:43
The interface class for creating an executor observer.
Definition: observer.hpp:27
virtual ~ObserverInterface()=default
virtual destructor