All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sf.util.StopWatch Maven / Gradle / Ivy

Go to download

SchemaCrawler is an open-source Java API that makes working with database metadata as easy as working with plain old Java objects. SchemaCrawler is also a database schema discovery and comprehension, and schema documentation tool. You can search for database schema objects using regular expressions, and output the schema and data in a readable text format. The output is designed to be diff-ed against other database schemas.

There is a newer version: 16.24.2
Show newest version
package sf.util;


import static java.time.temporal.ChronoField.HOUR_OF_DAY;
import static java.time.temporal.ChronoField.MINUTE_OF_HOUR;
import static java.time.temporal.ChronoField.NANO_OF_SECOND;
import static java.time.temporal.ChronoField.SECOND_OF_MINUTE;

import java.time.Duration;
import java.time.Instant;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Callable;

public final class StopWatch
{

  private static final class TaskInfo
  {

    private final String taskName;
    private final Duration duration;

    TaskInfo(final String taskName, final Duration duration)
    {
      this.taskName = taskName;
      this.duration = duration;
    }

    public Duration getDuration()
    {
      return duration;
    }

    @Override
    public String toString()
    {
      final LocalTime durationLocal = LocalTime.ofNanoOfDay(duration.toNanos());
      return String.format("%s - \"%s\"", durationLocal.format(df), taskName);
    }

  }

  private static final DateTimeFormatter df = new DateTimeFormatterBuilder()
    .appendValue(HOUR_OF_DAY, 2).appendLiteral(':')
    .appendValue(MINUTE_OF_HOUR, 2).appendLiteral(':')
    .appendValue(SECOND_OF_MINUTE, 2).appendFraction(NANO_OF_SECOND, 3, 3, true)
    .toFormatter();

  private final String id;
  private final List tasks = new LinkedList();

  // State for current task
  private Instant start;
  private boolean running;
  private Duration totalDuration;
  private String currentTaskName;

  public StopWatch(final String id)
  {
    this.id = id;
    totalDuration = Duration.ofNanos(0);
  }

  public String getId()
  {
    return id;
  }

  /**
   * Return whether the stop watch is currently running.
   *
   * @see #currentTaskName()
   */
  public boolean isRunning()
  {
    return running;
  }

  /**
   * Return the number of tasks timed.
   */
  public int size()
  {
    return tasks.size();
  }

  public void start(final String taskName)
  {
    if (running)
    {
      throw new IllegalStateException(String
        .format("Cannot stop \"%s\", since it is already running", id));
    }

    running = true;
    currentTaskName = taskName;
    start = Instant.now();
  }

  public void stop()
  {
    if (!running)
    {
      throw new IllegalStateException(String
        .format("Cannot stop \"%s\", since it is not running", id));
    }

    final Instant stop = Instant.now();
    final Duration runTime = Duration.between(start, stop);

    totalDuration = totalDuration.plus(runTime);

    final TaskInfo lastTaskInfo = new TaskInfo(currentTaskName, runTime);
    tasks.add(lastTaskInfo);

    running = false;
    currentTaskName = null;
    start = null;
  }

  public  V time(final String taskName, final Callable callable)
    throws Exception
  {
    start(taskName);
    final V returnValue = callable.call();
    stop();
    return returnValue;
  }

  @Override
  public String toString()
  {
    final StringBuilder buffer = new StringBuilder();

    final LocalTime totalDurationLocal = LocalTime
      .ofNanoOfDay(totalDuration.toNanos());
    buffer.append(String.format("Total time taken for \"%s\" - %s hours%n",
                                id,
                                totalDurationLocal.format(df)));

    for (final TaskInfo task: tasks)
    {
      buffer.append(String
        .format("- %4.1f%% - %s%n",
                calculatePercentage(task.getDuration(), totalDuration),
                task));
    }

    return buffer.toString();
  }

  private double calculatePercentage(final Duration duration,
                                     final Duration totalDuration)
  {
    final long totalSeconds = totalDuration.getSeconds();
    if (totalSeconds == 0)
    {
      return 0;
    }
    else
    {
      return duration.getSeconds() * 100D / totalSeconds;
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy