From e5e53660e33dd30b0b7b93f1904f9e95b78ff2ff Mon Sep 17 00:00:00 2001
From: Vojtech Moravec <vojtech.moravec.st@vsb.cz>
Date: Thu, 15 Oct 2020 12:26:11 +0200
Subject: [PATCH] Use more precise time measurement in Stopwatch.

---
 .../qcmp/compression/ImageDecompressor.java   |  3 +-
 .../cz/it4i/qcmp/utilities/Stopwatch.java     | 40 +++++++++----------
 2 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/src/main/java/cz/it4i/qcmp/compression/ImageDecompressor.java b/src/main/java/cz/it4i/qcmp/compression/ImageDecompressor.java
index 23503fa..74bea24 100644
--- a/src/main/java/cz/it4i/qcmp/compression/ImageDecompressor.java
+++ b/src/main/java/cz/it4i/qcmp/compression/ImageDecompressor.java
@@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable;
 
 import java.io.*;
 import java.util.Optional;
+import java.util.concurrent.TimeUnit;
 
 
 @SuppressWarnings("DuplicatedCode")
@@ -232,7 +233,7 @@ public class ImageDecompressor extends CompressorDecompressorBase {
             return false;
         }
         decompressionStopwatch.stop();
-        final double seconds = decompressionStopwatch.totalElapsedSeconds();
+        final double seconds = decompressionStopwatch.getElapsedInUnit(TimeUnit.SECONDS);
         final double MBSize = ((double) decompressedFileSize / 1000.0) / 1000.0;
         final double MBPerSec = MBSize / seconds;
         reportStatusToListeners("Decompression speed: %.4f MB/s", MBPerSec);
diff --git a/src/main/java/cz/it4i/qcmp/utilities/Stopwatch.java b/src/main/java/cz/it4i/qcmp/utilities/Stopwatch.java
index e09e195..1557591 100644
--- a/src/main/java/cz/it4i/qcmp/utilities/Stopwatch.java
+++ b/src/main/java/cz/it4i/qcmp/utilities/Stopwatch.java
@@ -2,14 +2,14 @@ package cz.it4i.qcmp.utilities;
 
 import org.jetbrains.annotations.NotNull;
 
-import java.time.Duration;
-import java.time.Instant;
+import java.util.concurrent.TimeUnit;
 
 public class Stopwatch {
 
     private final String name;
-    private Instant start;
-    Duration elapsed;
+    private boolean isMeasuring = false;
+    private long startTick;
+    private long elapsedTicks;
 
     @NotNull
     public static Stopwatch startNew(final String name) {
@@ -32,36 +32,36 @@ public class Stopwatch {
     }
 
     public void start() {
-        start = Instant.now();
+        isMeasuring = true;
+        startTick = System.nanoTime();
     }
 
     public void stop() {
-        final Instant end = Instant.now();
-        elapsed = Duration.between(start, end);
+        final long endTick = System.nanoTime();
+        isMeasuring = false;
+        elapsedTicks += endTick - startTick;
     }
 
-    public void restart() {
-        elapsed = null;
-        start = Instant.now();
-    }
-
-    public long totalElapsedNanoseconds() {
-        return elapsed.toNanos();
+    public void reset() {
+        isMeasuring = false;
+        elapsedTicks = 0;
     }
 
-    public long totalElapsedMilliseconds() {
-        return elapsed.toMillis();
+    public void restart() {
+        isMeasuring = true;
+        elapsedTicks = 0;
+        startTick = System.nanoTime();
     }
 
-    public double totalElapsedSeconds() {
-        return (elapsed.toNanos() / 1_000_000_000.0);
+    public long getElapsedInUnit(final TimeUnit timeUnit) {
+        return timeUnit.convert(elapsedTicks, TimeUnit.NANOSECONDS);
     }
 
     public String getElapsedTimeString() {
-        if (elapsed == null) {
+        if (isMeasuring || (elapsedTicks == 0)) {
             return "No time measured yet.";
         }
-        double MS = (double) elapsed.toMillis();
+        double MS = (double) getElapsedInUnit(TimeUnit.MILLISECONDS);
         double M = 0;
         double S = 0;
         double H = 0;
-- 
GitLab