This is an automated email from the ASF dual-hosted git repository. desruisseaux pushed a commit to branch geoapi-4.0 in repository https://gitbox.apache.org/repos/asf/sis.git
commit 3bc831a7be599823a4f98fa31f0623cae83c43ce Author: Martin Desruisseaux <martin.desruisse...@geomatys.com> AuthorDate: Thu Aug 12 01:31:59 2021 +0200 Group together the display of statistics about execution time. --- .../sis/test/storage/CoverageReadConsistency.java | 49 +++++++++++++++++----- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/storage/sis-storage/src/test/java/org/apache/sis/test/storage/CoverageReadConsistency.java b/storage/sis-storage/src/test/java/org/apache/sis/test/storage/CoverageReadConsistency.java index 793bbf1..8ff76ea 100644 --- a/storage/sis-storage/src/test/java/org/apache/sis/test/storage/CoverageReadConsistency.java +++ b/storage/sis-storage/src/test/java/org/apache/sis/test/storage/CoverageReadConsistency.java @@ -16,6 +16,8 @@ */ package org.apache.sis.test.storage; +import java.util.List; +import java.util.ArrayList; import java.util.Arrays; import java.util.Random; import java.awt.Point; @@ -33,10 +35,12 @@ import org.apache.sis.internal.util.StandardDateFormat; import org.apache.sis.internal.util.Numerics; import org.apache.sis.image.PixelIterator; import org.apache.sis.math.Statistics; +import org.apache.sis.math.StatisticsFormat; import org.apache.sis.util.ArraysExt; import org.apache.sis.test.DependsOnMethod; import org.apache.sis.test.TestUtilities; import org.apache.sis.test.TestCase; +import org.junit.AfterClass; import org.junit.Test; import static org.junit.Assert.*; @@ -53,6 +57,9 @@ import static org.junit.Assert.*; * we consider that the code reading the full extent is usually simpler than the code reading * a subset of data. * + * <p>This class is not thread-safe. Only one instance should exist in the JVM at a given time + * (because of the use of static fields).</p> + * * @author Martin Desruisseaux (Geomatys) * @version 1.1 * @since 1.1 @@ -110,6 +117,12 @@ public strictfp class CoverageReadConsistency extends TestCase { private final boolean failOnMismatch; /** + * Statistics about execution time. + * Created only in benchmark mode. + */ + private static List<Statistics> statistics; + + /** * Creates a new tester. This constructor reads immediately the coverage at full extent and full resolution. * That full coverage will be used as a reference for verifying the pixel values read in sub-domains. * Any mismatch in pixel values will cause immediate test failure. @@ -154,7 +167,7 @@ public strictfp class CoverageReadConsistency extends TestCase { */ @Test public void testSubRegionAtOrigin() throws DataStoreException { - readAndCompareRandomRegions(); + readAndCompareRandomRegions("Origin-R"); } /** @@ -167,7 +180,7 @@ public strictfp class CoverageReadConsistency extends TestCase { @DependsOnMethod("testSubRegionAtOrigin") public void testSubRegionsAnywhere() throws DataStoreException { allowOffsets = true; - readAndCompareRandomRegions(); + readAndCompareRandomRegions("Subregions"); } /** @@ -180,7 +193,7 @@ public strictfp class CoverageReadConsistency extends TestCase { @DependsOnMethod("testSubRegionAtOrigin") public void testSubsamplingAtOrigin() throws DataStoreException { allowSubsamplings = true; - readAndCompareRandomRegions(); + readAndCompareRandomRegions("Origin-S"); } /** @@ -194,7 +207,7 @@ public strictfp class CoverageReadConsistency extends TestCase { public void testSubsamplingAnywhere() throws DataStoreException { allowOffsets = true; allowSubsamplings = true; - readAndCompareRandomRegions(); + readAndCompareRandomRegions("Subsampling"); } /** @@ -206,7 +219,7 @@ public strictfp class CoverageReadConsistency extends TestCase { @DependsOnMethod("testSubRegionAtOrigin") public void testBandSubsetAtOrigin() throws DataStoreException { allowBandSubset = true; - readAndCompareRandomRegions(); + readAndCompareRandomRegions("Origin-B"); } /** @@ -219,7 +232,7 @@ public strictfp class CoverageReadConsistency extends TestCase { public void testBandSubsetAnywhere() throws DataStoreException { allowOffsets = true; allowBandSubset = true; - readAndCompareRandomRegions(); + readAndCompareRandomRegions("Bands"); } /** @@ -234,7 +247,7 @@ public strictfp class CoverageReadConsistency extends TestCase { allowOffsets = true; allowBandSubset = true; allowSubsamplings = true; - readAndCompareRandomRegions(); + readAndCompareRandomRegions("All"); } /** @@ -300,9 +313,10 @@ public strictfp class CoverageReadConsistency extends TestCase { /** * Implementation of methods testing reading in random sub-regions with random sub-samplings. * + * @param label a label for the test being run. * @throws DataStoreException if an error occurred while using the resource. */ - private void readAndCompareRandomRegions() throws DataStoreException { + private void readAndCompareRandomRegions(final String label) throws DataStoreException { randomConfigureResource(); final GridGeometry gg = resource.getGridGeometry(); final int dimension = gg.getDimension(); @@ -315,7 +329,7 @@ public strictfp class CoverageReadConsistency extends TestCase { * We will collect statistics on execution time only if the * test is executed in a more verbose mode than the default. */ - final Statistics durations = (VERBOSE || !failOnMismatch) ? new Statistics("time (ms)") : null; + final Statistics durations = (VERBOSE || !failOnMismatch) ? new Statistics(label) : null; int failuresCount = 0; for (int it=0; it < numIterations; it++) { final GridGeometry domain = randomDomain(gg, low, high, subsampling); @@ -417,7 +431,10 @@ nextSlice: for (;;) { * or if this `CoverageReadConsistency` is used for benchmark. */ if (durations != null) { - out.print(durations); + if (statistics == null) { + statistics = new ArrayList<>(); + } + statistics.add(durations); final int totalCount = durations.count(); out.println("Number of failures: " + failuresCount + " / " + totalCount + " (" + (failuresCount / (totalCount / 100f)) + "%)"); @@ -425,6 +442,18 @@ nextSlice: for (;;) { } /** + * Prints statistics about execution time (in milliseconds) after all tests completed. + */ + @AfterClass + public static void printDurations() { + if (statistics != null) { + // It is too late for using `TestCase.out`. + System.out.print(StatisticsFormat.getInstance().format(statistics.toArray(new Statistics[statistics.size()]))); + statistics = null; + } + } + + /** * Creates a pixel iterator for a sub-region in a slice of the specified coverage. * All coordinates given to this method are in the coordinate space of subsampled coverage subset. * This method returns {@code null} if the arguments are valid but the image can not be created