diff --git a/src/main/java/azgracompress/compression/SQImageCompressor.java b/src/main/java/azgracompress/compression/SQImageCompressor.java index cc52ed9d950f9e16cc85ba7a19c9a4527c0bb20c..2181a7a58b079859dd9548c4a84e7a5828fb998d 100644 --- a/src/main/java/azgracompress/compression/SQImageCompressor.java +++ b/src/main/java/azgracompress/compression/SQImageCompressor.java @@ -7,6 +7,7 @@ import azgracompress.io.OutBitStream; import azgracompress.io.RawDataIO; import azgracompress.quantization.scalar.LloydMaxU16ScalarQuantization; import azgracompress.quantization.scalar.ScalarQuantizer; +import azgracompress.utilities.Stopwatch; import java.io.DataOutputStream; import java.io.IOException; @@ -55,19 +56,23 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm */ public void compress(DataOutputStream compressStream) throws Exception { ScalarQuantizer quantizer = null; + Stopwatch stopwatch = new Stopwatch(); if (options.hasReferencePlaneIndex()) { + stopwatch.restart(); final ImageU16 referencePlane = RawDataIO.loadImageU16(options.getInputFile(), options.getImageDimension(), options.getReferencePlaneIndex()); Log(String.format("Training scalar quantizer from reference plane %d.", options.getReferencePlaneIndex())); quantizer = trainScalarQuantizerFromData(referencePlane.getData()); + stopwatch.stop(); writeCodebookToOutputStream(quantizer, compressStream); + Log("Reference codebook created in: " + stopwatch.getElapsedTimeString()); } final int[] planeIndices = getPlaneIndicesForCompression(); - for (final int planeIndex : planeIndices) { + stopwatch.restart(); Log(String.format("Loading plane %d.", planeIndex)); final ImageU16 plane = RawDataIO.loadImageU16(options.getInputFile(), options.getImageDimension(), @@ -89,7 +94,8 @@ public class SQImageCompressor extends CompressorDecompressorBase implements IIm } catch (IOException ioEx) { ioEx.printStackTrace(); } - + stopwatch.stop(); + Log("Plane time: " + stopwatch.getElapsedTimeString()); Log(String.format("Finished processing of plane %d", planeIndex)); } } diff --git a/src/main/java/azgracompress/compression/SQImageDecompressor.java b/src/main/java/azgracompress/compression/SQImageDecompressor.java index d12566dd8fa3add22453506507c00d1779561a8b..0c6cbea4899fcd294732663aea27c56d44638569 100644 --- a/src/main/java/azgracompress/compression/SQImageDecompressor.java +++ b/src/main/java/azgracompress/compression/SQImageDecompressor.java @@ -3,6 +3,7 @@ package azgracompress.compression; import azgracompress.cli.ParsedCliOptions; import azgracompress.fileformat.QCMPFileHeader; import azgracompress.io.InBitStream; +import azgracompress.utilities.Stopwatch; import azgracompress.utilities.TypeConverter; import java.io.DataInputStream; @@ -57,8 +58,9 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I quantizationValues = readScalarQuantizationValues(compressedStream, codebookSize); } - + Stopwatch stopwatch = new Stopwatch(); for (int planeIndex = 0; planeIndex < planeCountForDecompression; planeIndex++) { + stopwatch.restart(); if (header.isCodebookPerPlane()) { Log("Loading plane codebook..."); quantizationValues = readScalarQuantizationValues(compressedStream, codebookSize); @@ -78,7 +80,8 @@ public class SQImageDecompressor extends CompressorDecompressorBase implements I final byte[] decompressedPlaneData = TypeConverter.unsignedShortArrayToByteArray(decompressedValues, false); decompressStream.write(decompressedPlaneData); - Log(String.format("Decompressed plane %d.", planeIndex)); + stopwatch.stop(); + Log(String.format("Decompressed plane %d in %s.", planeIndex, stopwatch.getElapsedTimeString())); } } diff --git a/src/main/java/azgracompress/compression/VQImageCompressor.java b/src/main/java/azgracompress/compression/VQImageCompressor.java index 853b61767513eaf92fa8a25e6dd9f9fc1a2936e9..312cb18f542e2319a62c2228df6bda6dd7ef7dc6 100644 --- a/src/main/java/azgracompress/compression/VQImageCompressor.java +++ b/src/main/java/azgracompress/compression/VQImageCompressor.java @@ -10,6 +10,7 @@ import azgracompress.quantization.vector.CodebookEntry; import azgracompress.quantization.vector.LBGResult; import azgracompress.quantization.vector.LBGVectorQuantizer; import azgracompress.quantization.vector.VectorQuantizer; +import azgracompress.utilities.Stopwatch; import java.io.DataOutputStream; import java.io.IOException; @@ -79,7 +80,9 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm */ public void compress(DataOutputStream compressStream) throws Exception { VectorQuantizer quantizer = null; + Stopwatch stopwatch = new Stopwatch(); if (options.hasReferencePlaneIndex()) { + stopwatch.restart(); final ImageU16 referencePlane = RawDataIO.loadImageU16(options.getInputFile(), options.getImageDimension(), options.getReferencePlaneIndex()); @@ -88,12 +91,15 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm final int[][] refPlaneVectors = getPlaneVectors(referencePlane); quantizer = trainVectorQuantizerFromPlaneVectors(refPlaneVectors); writeQuantizerToCompressStream(quantizer, compressStream); - Log("Wrote reference codebook."); + stopwatch.stop(); + Log("Reference codebook created in: " + stopwatch.getElapsedTimeString()); } final int[] planeIndices = getPlaneIndicesForCompression(); + for (final int planeIndex : planeIndices) { + stopwatch.restart(); Log(String.format("Loading plane %d.", planeIndex)); final ImageU16 plane = RawDataIO.loadImageU16(options.getInputFile(), options.getImageDimension(), @@ -118,6 +124,8 @@ public class VQImageCompressor extends CompressorDecompressorBase implements IIm } catch (IOException ioEx) { ioEx.printStackTrace(); } + stopwatch.stop(); + Log("Plane time: " + stopwatch.getElapsedTimeString()); Log(String.format("Finished processing of plane %d.", planeIndex)); } } diff --git a/src/main/java/azgracompress/compression/VQImageDecompressor.java b/src/main/java/azgracompress/compression/VQImageDecompressor.java index 03913c97c8def7b12ada65924f704f081ebd9be1..c124cbadb4ea887f8a4b44d27b3025cfa9343c96 100644 --- a/src/main/java/azgracompress/compression/VQImageDecompressor.java +++ b/src/main/java/azgracompress/compression/VQImageDecompressor.java @@ -4,6 +4,7 @@ import azgracompress.cli.ParsedCliOptions; import azgracompress.data.*; import azgracompress.fileformat.QCMPFileHeader; import azgracompress.io.InBitStream; +import azgracompress.utilities.Stopwatch; import azgracompress.utilities.TypeConverter; import java.io.DataInputStream; @@ -103,8 +104,9 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I quantizationVectors = readCodebookVectors(compressedStream, codebookSize, vectorSize); } - + Stopwatch stopwatch = new Stopwatch(); for (int planeIndex = 0; planeIndex < planeCountForDecompression; planeIndex++) { + stopwatch.restart(); if (header.isCodebookPerPlane()) { Log("Loading plane codebook..."); quantizationVectors = readCodebookVectors(compressedStream, codebookSize, vectorSize); @@ -134,7 +136,8 @@ public class VQImageDecompressor extends CompressorDecompressorBase implements I decompressedPlane.getData(), false); decompressStream.write(decompressedPlaneData); - Log(String.format("Decompressed plane %d.", planeIndex)); + stopwatch.stop(); + Log(String.format("Decompressed plane %d in %s.", planeIndex, stopwatch.getElapsedTimeString())); } } diff --git a/src/main/java/azgracompress/quantization/vector/LBGVectorQuantizer.java b/src/main/java/azgracompress/quantization/vector/LBGVectorQuantizer.java index 71d8f4e9d1794d2099f7b1ae60fa546d0d54c310..a927146b6db65753886fa83a3dae4ef0c9d6aef9 100644 --- a/src/main/java/azgracompress/quantization/vector/LBGVectorQuantizer.java +++ b/src/main/java/azgracompress/quantization/vector/LBGVectorQuantizer.java @@ -316,7 +316,7 @@ public class LBGVectorQuantizer { biggestPartition.removeTrainingVectorAndDistance(randomIndex); // Redistribute biggest partition training vectors - @SuppressWarnings("unchecked") final ArrayList<int[]> partitionVectors = + final ArrayList<int[]> partitionVectors = (ArrayList<int[]>) biggestPartition.getTrainingVectors().clone(); biggestPartition.clearTrainingData(); diff --git a/src/main/java/azgracompress/utilities/Stopwatch.java b/src/main/java/azgracompress/utilities/Stopwatch.java index 53692fa1156a4ba650e87e4c2c3c409b8069c3ac..fc695d084062701fa1ea2a7a83193d8f98b23219 100644 --- a/src/main/java/azgracompress/utilities/Stopwatch.java +++ b/src/main/java/azgracompress/utilities/Stopwatch.java @@ -41,7 +41,8 @@ public class Stopwatch { if (elapsed == null) { return "No time measured yet."; } - return String.format("%dH %dMin %d Sec %d Ms", elapsed.toHoursPart(), elapsed.toMinutesPart(), elapsed.toSecondsPart(), elapsed.toMillisPart()); + return String.format("%dH %dmin %dsec %dms %dns", elapsed.toHoursPart(), elapsed.toMinutesPart(), elapsed.toSecondsPart(), elapsed.toMillisPart(), elapsed.toNanosPart()); + } @Override