[Bf-blender-cvs] [c7991bcefca] master: BLI: add ScopedTimer

Jacques Lucke noreply at git.blender.org
Wed Apr 22 12:59:16 CEST 2020


Commit: c7991bcefcaa2924597bd8fe55ce63905fe0f23e
Author: Jacques Lucke
Date:   Wed Apr 22 12:53:47 2020 +0200
Branches: master
https://developer.blender.org/rBc7991bcefcaa2924597bd8fe55ce63905fe0f23e

BLI: add ScopedTimer

This adds a simple timer that can be used for performance measurements in C++.
More sophisticated timers are possible (e.g. one that takes averages, logs the results, ...).
However, I found that this simple timer is good enough for 99% of my use cases.

To use it just write `SCOPED_TIMER("my timer name");` or more commonly `SCOPED_TIMER(__func__);`
into some scope.

Reviewers: sergey

Differential Revision: https://developer.blender.org/D7491

===================================================================

A	source/blender/blenlib/BLI_timeit.hh
M	source/blender/blenlib/CMakeLists.txt
A	source/blender/blenlib/intern/timeit.cc

===================================================================

diff --git a/source/blender/blenlib/BLI_timeit.hh b/source/blender/blenlib/BLI_timeit.hh
new file mode 100644
index 00000000000..e9f121ec654
--- /dev/null
+++ b/source/blender/blenlib/BLI_timeit.hh
@@ -0,0 +1,62 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef __BLI_TIMEIT_HH__
+#define __BLI_TIMEIT_HH__
+
+#include <chrono>
+#include <iostream>
+#include <string>
+
+#include "BLI_sys_types.h"
+
+namespace BLI {
+namespace Timeit {
+
+using Clock = std::chrono::steady_clock;
+using TimePoint = Clock::time_point;
+using Nanoseconds = std::chrono::nanoseconds;
+
+void print_duration(Nanoseconds duration);
+
+class ScopedTimer {
+ private:
+  std::string m_name;
+  TimePoint m_start;
+
+ public:
+  ScopedTimer(std::string name) : m_name(std::move(name))
+  {
+    m_start = Clock::now();
+  }
+
+  ~ScopedTimer()
+  {
+    TimePoint end = Clock::now();
+    Nanoseconds duration = end - m_start;
+
+    std::cout << "Timer '" << m_name << "' took ";
+    print_duration(duration);
+    std::cout << '\n';
+  }
+};
+
+}  // namespace Timeit
+}  // namespace BLI
+
+#define SCOPED_TIMER(name) BLI::Timeit::ScopedTimer scoped_timer(name)
+
+#endif /* __BLI_TIMEIT_HH__ */
diff --git a/source/blender/blenlib/CMakeLists.txt b/source/blender/blenlib/CMakeLists.txt
index 0835f09fa5d..19089447b95 100644
--- a/source/blender/blenlib/CMakeLists.txt
+++ b/source/blender/blenlib/CMakeLists.txt
@@ -123,6 +123,7 @@ set(SRC
   intern/threads.c
   intern/time.c
   intern/timecode.c
+  intern/timeit.cc
   intern/uvproject.c
   intern/voronoi_2d.c
   intern/voxel.c
@@ -243,6 +244,7 @@ set(SRC
   BLI_task.h
   BLI_threads.h
   BLI_timecode.h
+  BLI_timeit.hh
   BLI_timer.h
   BLI_utildefines.h
   BLI_utildefines_iter.h
diff --git a/source/blender/blenlib/intern/timeit.cc b/source/blender/blenlib/intern/timeit.cc
new file mode 100644
index 00000000000..bab8fd81746
--- /dev/null
+++ b/source/blender/blenlib/intern/timeit.cc
@@ -0,0 +1,36 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include "BLI_timeit.hh"
+
+namespace BLI {
+namespace Timeit {
+
+void print_duration(Nanoseconds duration)
+{
+  if (duration < std::chrono::microseconds(100)) {
+    std::cout << duration.count() << " ns";
+  }
+  else if (duration < std::chrono::seconds(5)) {
+    std::cout << duration.count() / 1.0e6 << " ms";
+  }
+  else {
+    std::cout << duration.count() / 1.0e9 << " s";
+  }
+}
+
+}  // namespace Timeit
+}  // namespace BLI



More information about the Bf-blender-cvs mailing list