[compiler-rt] 2e9bcad - Revert "[scudo] Add a Timer class to assist performance measurement"

Chia-hung Duan via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 23 14:49:39 PDT 2023


Author: Chia-hung Duan
Date: 2023-03-23T21:49:02Z
New Revision: 2e9bcadb7c8acaa8f6ec7d807e5666246923e468

URL: https://github.com/llvm/llvm-project/commit/2e9bcadb7c8acaa8f6ec7d807e5666246923e468
DIFF: https://github.com/llvm/llvm-project/commit/2e9bcadb7c8acaa8f6ec7d807e5666246923e468.diff

LOG: Revert "[scudo] Add a Timer class to assist performance measurement"

This reverts commit e0361396c2281a108a36d186161ace1843925431.

Added: 
    

Modified: 
    compiler-rt/lib/scudo/standalone/CMakeLists.txt
    compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt

Removed: 
    compiler-rt/lib/scudo/standalone/tests/timing_test.cpp
    compiler-rt/lib/scudo/standalone/timing.cpp
    compiler-rt/lib/scudo/standalone/timing.h


################################################################################
diff  --git a/compiler-rt/lib/scudo/standalone/CMakeLists.txt b/compiler-rt/lib/scudo/standalone/CMakeLists.txt
index 6fcd4deddf716..eefcffd4cfc56 100644
--- a/compiler-rt/lib/scudo/standalone/CMakeLists.txt
+++ b/compiler-rt/lib/scudo/standalone/CMakeLists.txt
@@ -85,7 +85,6 @@ set(SCUDO_HEADERS
   stack_depot.h
   stats.h
   string_utils.h
-  timing.h
   tsd_exclusive.h
   tsd_shared.h
   tsd.h
@@ -108,7 +107,6 @@ set(SCUDO_SOURCES
   report.cpp
   rss_limit_checker.cpp
   string_utils.cpp
-  timing.cpp
   )
 
 # Enable the necessary instruction set for scudo_crc32.cpp, if available.

diff  --git a/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt b/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt
index 335e4b7dbd899..50468d9c6ddc3 100644
--- a/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt
+++ b/compiler-rt/lib/scudo/standalone/tests/CMakeLists.txt
@@ -105,7 +105,6 @@ set(SCUDO_UNIT_TEST_SOURCES
   size_class_map_test.cpp
   stats_test.cpp
   strings_test.cpp
-  timing_test.cpp
   tsd_test.cpp
   vector_test.cpp
   scudo_unit_test_main.cpp

diff  --git a/compiler-rt/lib/scudo/standalone/tests/timing_test.cpp b/compiler-rt/lib/scudo/standalone/tests/timing_test.cpp
deleted file mode 100644
index 09a6c31224673..0000000000000
--- a/compiler-rt/lib/scudo/standalone/tests/timing_test.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-//===-- timing_test.cpp -----------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "tests/scudo_unit_test.h"
-
-#include "timing.h"
-
-#include <string>
-
-class ScudoTimingTest : public Test {
-public:
-  void testFunc1() { scudo::ScopedTimer ST(Manager, __func__); }
-
-  void testFunc2() {
-    scudo::ScopedTimer ST(Manager, __func__);
-    testFunc1();
-  }
-
-  void testChainedCalls() {
-    scudo::ScopedTimer ST(Manager, __func__);
-    testFunc2();
-  }
-
-  void testIgnoredTimer() {
-    scudo::ScopedTimer ST(Manager, __func__);
-    ST.ignore();
-  }
-
-  void printAllTimersStats() { Manager.printAll(); }
-
-  scudo::TimingManager &getTimingManager() { return Manager; }
-
-private:
-  scudo::TimingManager Manager;
-};
-
-// Given that the output of statistics of timers are dumped through
-// `scudo::Printf` which is platform dependent, so we don't have a reliable way
-// to catch the output and verify the details. Now we only verify the number of
-// invocations on linux.
-TEST_F(ScudoTimingTest, SimpleTimer) {
-#if SCUDO_LINUX
-  testing::internal::LogToStderr();
-  testing::internal::CaptureStderr();
-#endif
-
-  testIgnoredTimer();
-  testChainedCalls();
-  printAllTimersStats();
-
-#if SCUDO_LINUX
-  std::string output = testing::internal::GetCapturedStderr();
-  EXPECT_TRUE(output.find("testIgnoredTimer (1)") == std::string::npos);
-  EXPECT_TRUE(output.find("testChainedCalls (1)") != std::string::npos);
-  EXPECT_TRUE(output.find("testFunc2 (1)") != std::string::npos);
-  EXPECT_TRUE(output.find("testFunc1 (1)") != std::string::npos);
-#endif
-}
-
-TEST_F(ScudoTimingTest, NestedTimer) {
-#if SCUDO_LINUX
-  testing::internal::LogToStderr();
-  testing::internal::CaptureStderr();
-#endif
-
-  {
-    scudo::ScopedTimer Outer(getTimingManager(), "Outer");
-    {
-      scudo::ScopedTimer Inner1(getTimingManager(), Outer, "Inner1");
-      { scudo::ScopedTimer Inner2(getTimingManager(), Inner1, "Inner2"); }
-    }
-  }
-  printAllTimersStats();
-
-#if SCUDO_LINUX
-  std::string output = testing::internal::GetCapturedStderr();
-  EXPECT_TRUE(output.find("Outer (1)") != std::string::npos);
-  EXPECT_TRUE(output.find("Inner1 (1)") != std::string::npos);
-  EXPECT_TRUE(output.find("Inner2 (1)") != std::string::npos);
-#endif
-}

diff  --git a/compiler-rt/lib/scudo/standalone/timing.cpp b/compiler-rt/lib/scudo/standalone/timing.cpp
deleted file mode 100644
index 59ae21d10f0f6..0000000000000
--- a/compiler-rt/lib/scudo/standalone/timing.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-//===-- timing.cpp ----------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "timing.h"
-
-namespace scudo {
-
-Timer::~Timer() {
-  if (Manager)
-    Manager->report(*this);
-}
-
-ScopedTimer::ScopedTimer(TimingManager &Manager, const char *Name)
-    : Timer(Manager.getOrCreateTimer(Name)) {
-  start();
-}
-
-ScopedTimer::ScopedTimer(TimingManager &Manager, const Timer &Nest,
-                         const char *Name)
-    : Timer(Manager.nest(Nest, Name)) {
-  start();
-}
-
-} // namespace scudo

diff  --git a/compiler-rt/lib/scudo/standalone/timing.h b/compiler-rt/lib/scudo/standalone/timing.h
deleted file mode 100644
index 155111f9f8e52..0000000000000
--- a/compiler-rt/lib/scudo/standalone/timing.h
+++ /dev/null
@@ -1,215 +0,0 @@
-//===-- timing.h ------------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "common.h"
-#include "mutex.h"
-#include "string_utils.h"
-#include "thread_annotations.h"
-
-#include <string.h>
-
-namespace scudo {
-
-class TimingManager;
-
-// A simple timer for evaluating execution time of code snippets. It can be used
-// along with TimingManager or standalone.
-class Timer {
-public:
-  // The use of Timer without binding to a TimingManager is supposed to do the
-  // timer logging manually. Otherwise, TimingManager will do the logging stuff
-  // for you.
-  Timer() = default;
-  Timer(Timer &&Other)
-      : StartTime(0), AccTime(Other.AccTime), Manager(Other.Manager),
-        HandleId(Other.HandleId) {
-    Other.Manager = nullptr;
-  }
-
-  Timer(const Timer &) = delete;
-
-  virtual ~Timer();
-
-  void start() {
-    CHECK_EQ(StartTime, 0U);
-    StartTime = getMonotonicTime();
-  }
-  void stop() {
-    AccTime += getMonotonicTime() - StartTime;
-    StartTime = 0;
-  }
-  u64 getAccumulatedTime() const { return AccTime; }
-
-  // Unset the bound TimingManager so that we don't report the data back. This
-  // is useful if we only want to track subset of certain scope events.
-  void ignore() {
-    StartTime = 0;
-    AccTime = 0;
-    Manager = nullptr;
-  }
-
-protected:
-  friend class TimingManager;
-  Timer(TimingManager &Manager, u32 HandleId)
-      : Manager(&Manager), HandleId(HandleId) {}
-
-  u64 StartTime = 0;
-  u64 AccTime = 0;
-  TimingManager *Manager = nullptr;
-  u32 HandleId;
-};
-
-// A RAII-style wrapper for easy scope execution measurement. Note that in order
-// not to take additional space for the message like `Name`. It only works with
-// TimingManager.
-class ScopedTimer : public Timer {
-public:
-  ScopedTimer(TimingManager &Manager, const char *Name);
-  ScopedTimer(TimingManager &Manager, const Timer &Nest, const char *Name);
-  ~ScopedTimer() override { stop(); }
-};
-
-// In Scudo, the execution time of single run of code snippets may not be
-// useful, we are more interested in the average time from several runs.
-// TimingManager lets the registered timer report their data and reports the
-// average execution time for each timer periodically.
-class TimingManager {
-public:
-  TimingManager(u32 PrintingInterval = DefaultPrintingInterval)
-      : PrintingInterval(PrintingInterval) {}
-  ~TimingManager() {
-    if (NumAllocatedTimers != 0)
-      printAll();
-  }
-
-  Timer getOrCreateTimer(const char *Name) EXCLUDES(Mutex) {
-    ScopedLock L(Mutex);
-
-    CHECK_LT(strlen(Name), MaxLenOfTimerName);
-    for (u32 I = 0; I < NumAllocatedTimers; ++I) {
-      if (strncmp(Name, Timers[I].Name, MaxLenOfTimerName) == 0)
-        return Timer(*this, I);
-    }
-
-    CHECK_LT(NumAllocatedTimers, MaxNumberOfTimers);
-    strncpy(Timers[NumAllocatedTimers].Name, Name, MaxLenOfTimerName);
-    TimerRecords[NumAllocatedTimers].AccumulatedTime = 0;
-    TimerRecords[NumAllocatedTimers].Occurrence = 0;
-    return Timer(*this, NumAllocatedTimers++);
-  }
-
-  // Add a sub-Timer associated with another Timer. This is used when we want to
-  // detail the execution time in the scope of a Timer.
-  // For example,
-  //   void Foo() {
-  //     // T1 records the time spent in both first and second tasks.
-  //     ScopedTimer T1(getTimingManager(), "Task1");
-  //     {
-  //       // T2 records the time spent in first task
-  //       ScopedTimer T2(getTimingManager, T1, "Task2");
-  //       // Do first task.
-  //     }
-  //     // Do second task.
-  //   }
-  //
-  // The report will show proper indents to indicate the nested relation like,
-  //   -- Average Operation Time -- -- Name (# of Calls) --
-  //             10.0(ns)            Task1 (1)
-  //              5.0(ns)              Task2 (1)
-  Timer nest(const Timer &T, const char *Name) EXCLUDES(Mutex) {
-    CHECK_EQ(T.Manager, this);
-    Timer Nesting = getOrCreateTimer(Name);
-
-    ScopedLock L(Mutex);
-    CHECK_NE(Nesting.HandleId, T.HandleId);
-    Timers[Nesting.HandleId].Nesting = T.HandleId;
-    return Nesting;
-  }
-
-  void report(const Timer &T) EXCLUDES(Mutex) {
-    ScopedLock L(Mutex);
-
-    const u32 HandleId = T.HandleId;
-    CHECK_LT(HandleId, MaxNumberOfTimers);
-    TimerRecords[HandleId].AccumulatedTime += T.getAccumulatedTime();
-    ++TimerRecords[HandleId].Occurrence;
-    ++NumEventsReported;
-    if (NumEventsReported % PrintingInterval == 0)
-      printAllImpl();
-  }
-
-  void printAll() EXCLUDES(Mutex) {
-    ScopedLock L(Mutex);
-    printAllImpl();
-  }
-
-private:
-  void printAllImpl() REQUIRES(Mutex) {
-    static char NameHeader[] = "-- Name (# of Calls) --";
-    static char AvgHeader[] = "-- Average Operation Time --";
-    ScopedString Str;
-    Str.append("%-15s %-15s\n", AvgHeader, NameHeader);
-
-    for (u32 I = 0; I < NumAllocatedTimers; ++I) {
-      if (Timers[I].Nesting != MaxNumberOfTimers)
-        continue;
-      printImpl(Str, I);
-    }
-
-    Str.output();
-  }
-
-  void printImpl(ScopedString &Str, const u32 HandleId,
-                 const u32 ExtraIndent = 0) REQUIRES(Mutex) {
-    const uptr AccumulatedTime = TimerRecords[HandleId].AccumulatedTime;
-    const uptr Occurrence = TimerRecords[HandleId].Occurrence;
-    const uptr Integral = Occurrence == 0 ? 0 : AccumulatedTime / Occurrence;
-    // Only keep single digit of fraction is enough and it enables easier layout
-    // maintenance.
-    const uptr Fraction =
-        Occurrence == 0 ? 0
-                        : ((AccumulatedTime % Occurrence) * 10) / Occurrence;
-
-    Str.append("%14zu.%zu(ns) %-11s", Integral, Fraction, " ");
-
-    for (u32 I = 0; I < ExtraIndent; ++I)
-      Str.append("%s", "  ");
-    Str.append("%s (%zu)\n", Timers[HandleId].Name, Occurrence);
-
-    for (u32 I = 0; I < NumAllocatedTimers; ++I)
-      if (Timers[I].Nesting == HandleId)
-        printImpl(Str, I, ExtraIndent + 1);
-  }
-
-  // Instead of maintaining pages for timer registration, a static buffer is
-  // sufficient for most use cases in Scudo.
-  static constexpr u32 MaxNumberOfTimers = 50;
-  static constexpr u32 MaxLenOfTimerName = 50;
-  static constexpr u32 DefaultPrintingInterval = 100;
-
-  struct Record {
-    uptr AccumulatedTime = 0;
-    uptr Occurrence = 0;
-  };
-
-  struct TimerInfo {
-    char Name[MaxLenOfTimerName + 1];
-    u32 Nesting = MaxNumberOfTimers;
-  };
-
-  HybridMutex Mutex;
-  // The frequency of proactively dumping the timer statistics. For example, the
-  // default setting is to dump the statistics every 100 reported events.
-  u32 PrintingInterval GUARDED_BY(Mutex);
-  uptr NumEventsReported GUARDED_BY(Mutex) = 0;
-  u32 NumAllocatedTimers GUARDED_BY(Mutex) = 0;
-  TimerInfo Timers[MaxNumberOfTimers] GUARDED_BY(Mutex);
-  Record TimerRecords[MaxNumberOfTimers] GUARDED_BY(Mutex);
-};
-
-} // namespace scudo


        


More information about the llvm-commits mailing list