From 13553e1a07db0ea97cf2f44f5ec886eec776df1a Mon Sep 17 00:00:00 2001 From: flamingcow Date: Fri, 10 May 2019 23:04:26 -0700 Subject: [PATCH] Working getrusage and wall clock metrics --- .gitignore | 1 + Makefile | 7 +++++-- example_loop.cc | 22 ++++++++++++++++++++ usage.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++-- usage.h | 18 +++++++++++++++-- 5 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 example_loop.cc diff --git a/.gitignore b/.gitignore index d0bc775..f823577 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.a *.o *.so +example_loop diff --git a/Makefile b/Makefile index cf5cc10..a55b1a0 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ FIRE_CXX ?= clang++ FIRE_CXXFLAGS ?= -O3 -std=gnu++2a -Wall -Werror -Wextra -fPIE -fPIC -fstack-protector-strong -fsanitize=safe-stack -fsanitize=safe-stack FIRE_LDFLAGS ?= -fuse-ld=gold -flto -Wl,-z,relro -Wl,-z,now -FIRE_LDLIBS ?= -lglog +FIRE_LDLIBS ?= -lgflags -lglog -all: fireusage.a fireusage.o fireusage.so +all: fireusage.a fireusage.o fireusage.so example_loop objects = usage.o @@ -16,6 +16,9 @@ fireusage.o: $(objects) fireusage.so: $(objects) $(FIRE_CXX) $(FIRE_CXXFLAGS) $(FIRE_LDFLAGS) -shared -o $@ $+ $(FIRE_LDFLIBS) +example_loop: example_loop.o fireusage.o + $(FIRE_CXX) $(FIRE_CXXFLAGS) $(FIRE_LDFLAGS) -pie -o $@ $+ $(FIRE_LDLIBS) + %.o: %.cc *.h Makefile $(FIRE_CXX) $(FIRE_CXXFLAGS) -c -o $@ $< diff --git a/example_loop.cc b/example_loop.cc new file mode 100644 index 0000000..48bb949 --- /dev/null +++ b/example_loop.cc @@ -0,0 +1,22 @@ +#include +#include + +#include "usage.h" + +int main(int argc, char *argv[]) { + google::InitGoogleLogging(argv[0]); + gflags::ParseCommandLineFlags(&argc, &argv, true); + + fireusage::UsageTracker tracker; + tracker.Start(); + for (int i = 0; i < 100000000; ++i) { + tracker.AddEvent(); + for (int _ = 0; _ < 100000; ++_) { + } + } + tracker.Stop(); + tracker.Log(); + + gflags::ShutDownCommandLineFlags(); + google::ShutdownGoogleLogging(); +} diff --git a/usage.cc b/usage.cc index 4d218ef..a146b43 100644 --- a/usage.cc +++ b/usage.cc @@ -1,9 +1,58 @@ +#include +#include + #include "usage.h" namespace fireusage { -UsageTracker::UsageTracker(const std::string_view& plural_resource_name) - : plural_resource_name_(plural_resource_name) { +namespace { + +std::chrono::nanoseconds TvToNs(const timeval& tv) { + return std::chrono::seconds(tv.tv_sec) + std::chrono::microseconds(tv.tv_usec); + +} + +} // namespace + +void UsageTracker::AddEvents(uint64_t num) { + events_ += num; +} + +void UsageTracker::AddEvent() { + events_ += 1; +} + +void UsageTracker::Start() { + CHECK(!running_); + running_ = true; + + PCHECK(getrusage(RUSAGE_THREAD, &start_usage_) == 0); + start_time_ = std::chrono::steady_clock::now(); +} + +void UsageTracker::Stop() { + CHECK(running_); + running_ = false; + + const auto end_time_ = std::chrono::steady_clock::now(); + + rusage end_usage_; + PCHECK(getrusage(RUSAGE_THREAD, &end_usage_) == 0); + + wall_time_ += end_time_ - start_time_; + user_time_ += TvToNs(end_usage_.ru_utime) - TvToNs(start_usage_.ru_utime); + sys_time_ += TvToNs(end_usage_.ru_stime) - TvToNs(start_usage_.ru_stime); +} + +void UsageTracker::Log() { + LOG(INFO) << "usage:"; + LOG(INFO) << "\tevents: " << std::setw(20) << std::setfill(' ') << events_; + LOG(INFO) << "\twall time: " << std::setw(20) << std::setfill(' ') << wall_time_.count() << "ns"; + LOG(INFO) << "\tuser time: " << std::setw(20) << std::setfill(' ') << user_time_.count() << "ns"; + LOG(INFO) << "\tsys time: " << std::setw(20) << std::setfill(' ') << sys_time_.count() << "ns"; + LOG(INFO) << "\twall time / event: " << std::setw(20) << std::setfill(' ') << (wall_time_ / events_).count() << "ns"; + LOG(INFO) << "\tuser time / event: " << std::setw(20) << std::setfill(' ') << (user_time_ / events_).count() << "ns"; + LOG(INFO) << "\tsys time / event: " << std::setw(20) << std::setfill(' ') << (sys_time_ / events_).count() << "ns"; } } // namespace fireusage diff --git a/usage.h b/usage.h index 6291e3b..9f554a0 100644 --- a/usage.h +++ b/usage.h @@ -1,15 +1,29 @@ #pragma once +#include #include +#include namespace fireusage { class UsageTracker { public: - UsageTracker(const std::string_view& plural_resource_name); + void AddEvents(uint64_t num); + void AddEvent(); + + void Start(); + void Stop(); + void Log(); private: - const std::string plural_resource_name_; + bool running_ = false; + uint64_t events_ = 0; + std::chrono::nanoseconds wall_time_; + std::chrono::nanoseconds user_time_; + std::chrono::nanoseconds sys_time_; + + std::chrono::steady_clock::time_point start_time_; + rusage start_usage_; }; } // namespace fireusage