From c14b87b228b841bc6fd6f089681baadbe364ea42 Mon Sep 17 00:00:00 2001 From: Starlight220 <53231611+Starlight220@users.noreply.github.com> Date: Thu, 2 Apr 2020 06:09:40 +0300 Subject: [PATCH] [wpilibj] Refactor Tracer functionality out of Watchdog class (#2452) --- .../java/edu/wpi/first/wpilibj/Tracer.java | 95 +++++++++++++++++++ .../java/edu/wpi/first/wpilibj/Watchdog.java | 26 ++--- 2 files changed, 104 insertions(+), 17 deletions(-) create mode 100644 wpilibj/src/main/java/edu/wpi/first/wpilibj/Tracer.java diff --git a/wpilibj/src/main/java/edu/wpi/first/wpilibj/Tracer.java b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Tracer.java new file mode 100644 index 0000000000..3518023479 --- /dev/null +++ b/wpilibj/src/main/java/edu/wpi/first/wpilibj/Tracer.java @@ -0,0 +1,95 @@ +/*----------------------------------------------------------------------------*/ +/* Copyright (c) 2018-2020 FIRST. All Rights Reserved. */ +/* Open Source Software - may be modified and shared by FRC teams. The code */ +/* must be accompanied by the FIRST BSD license file in the root directory of */ +/* the project. */ +/*----------------------------------------------------------------------------*/ + +package edu.wpi.first.wpilibj; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; + +/** + * A class for keeping track of how much time it takes for different parts of code to execute. + * This is done with epochs, that are added by calls to {@link #addEpoch(String)}, + * and can be printed with a call to {@link #printEpochs()}. + * + *
Epochs are a way to partition the time elapsed so that when overruns occur, one can
+ * determine which parts of an operation consumed the most time.
+ */
+public class Tracer {
+ private static final long kMinPrintPeriod = 1000000; // microseconds
+
+ private long m_lastEpochsPrintTime; // microseconds
+ private long m_startTime; // microseconds
+
+ @SuppressWarnings("PMD.UseConcurrentHashMap")
+ private final Map Epochs are a way to partition the time elapsed so that when overruns occur, one can
+ * determine which parts of an operation consumed the most time.
+ *
+ * This should be called immediately after execution has finished,
+ * with a call to this method or {@link #resetTimer()} before execution.
+ *
+ * @param epochName The name to associate with the epoch.
+ */
+ public void addEpoch(String epochName) {
+ long currentTime = RobotController.getFPGATime();
+ m_epochs.put(epochName, currentTime - m_startTime);
+ m_startTime = currentTime;
+ }
+
+ /**
+ * Prints list of epochs added so far and their times to the DriverStation.
+ */
+ public void printEpochs() {
+ printEpochs(out -> DriverStation.reportWarning(out, false));
+ }
+
+ /**
+ * Prints list of epochs added so far and their times to the entered String consumer.
+ *
+ * This overload can be useful for logging to a file, etc.
+ *
+ * @param output the stream that the output is sent to
+ */
+ public void printEpochs(Consumer Epochs are a way to partition the time elapsed so that when overruns occur, one can
- * determine which parts of an operation consumed the most time.
+ * @see Tracer#addEpoch(String)
*
* @param epochName The name to associate with the epoch.
*/
public void addEpoch(String epochName) {
- long currentTime = RobotController.getFPGATime();
- m_epochs.put(epochName, currentTime - m_startTime);
- m_startTime = currentTime;
+ m_tracer.addEpoch(epochName);
}
/**
* Prints list of epochs added so far and their times.
+ * @see Tracer#printEpochs()
*/
public void printEpochs() {
- long now = RobotController.getFPGATime();
- if (now - m_lastEpochsPrintTime > kMinPrintPeriod) {
- m_lastEpochsPrintTime = now;
- m_epochs.forEach((key, value) -> System.out.format("\t%s: %.6fs\n", key, value / 1.0e6));
- }
+ m_tracer.printEpochs();
}
/**
@@ -166,7 +158,7 @@ public class Watchdog implements Closeable, Comparable