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 11c6b74bf448ebc5c2e32fa2afca95f8f274798d Author: Martin Desruisseaux <[email protected]> AuthorDate: Sat Dec 26 15:28:33 2020 +0100 Avoid the call to `Arrays.binarySearch(…)`. It has been identified by profiling as a performance bottleneck (in the context of `Isolines`). --- .../internal/processing/image/IsolineTracer.java | 2 +- .../sis/internal/processing/image/Isolines.java | 23 ++++++---------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/image/IsolineTracer.java b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/image/IsolineTracer.java index 8f8f1c4..e42e362 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/image/IsolineTracer.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/image/IsolineTracer.java @@ -103,7 +103,7 @@ final class IsolineTracer { */ final class Level { /** - * The level value. This is a copy of {@link Isolines#levelValues} at the index of this level. + * The level value. * * @see #interpolate(int, int) */ diff --git a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/image/Isolines.java b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/image/Isolines.java index 5f359e2..e1c6443 100644 --- a/core/sis-feature/src/main/java/org/apache/sis/internal/processing/image/Isolines.java +++ b/core/sis-feature/src/main/java/org/apache/sis/internal/processing/image/Isolines.java @@ -53,17 +53,7 @@ import static org.apache.sis.internal.processing.image.IsolineTracer.LOWER_RIGHT */ public final class Isolines { /** - * Values for which to compute isolines, sorted in ascending order and without NaN values. - * This array is used for {@linkplain Arrays#binarySearch(double[], double) binary searches}. - * Each value is associated to an instance in the {@link #levels} array. - * - * @see IsolineTracer.Level#value - */ - private final double[] levelValues; - - /** - * Isoline data for each level. - * The length of this array is equal to the {@link #levelValues} array length. + * Isoline data for each level, sorted in ascending order of {@link IsolineTracer.Level#value}. */ private final IsolineTracer.Level[] levels; @@ -82,10 +72,9 @@ public final class Isolines { System.arraycopy(values, i, values, i-1, n-- - i); } } - levelValues = ArraysExt.resize(values, n); levels = new IsolineTracer.Level[n]; for (int i=0; i<n; i++) { - levels[i] = tracer.new Level(levelValues[i], width); + levels[i] = tracer.new Level(values[i], width); } } @@ -112,10 +101,10 @@ public final class Isolines { * {@value IsolineTracer#LOWER_LEFT} or {@value IsolineTracer#LOWER_RIGHT}. */ private void setMaskBit(final DoubleBuffer data, final int bit) { - int i = Arrays.binarySearch(levelValues, data.get()); - if (i < 0) i = ~i; // Really tild, not minus. - while (--i >= 0) { // Value is higher than all levels below `i`. - levels[i].isDataAbove |= bit; + final double value = data.get(); + for (final IsolineTracer.Level level : levels) { + if (level.value > value) break; // See above javadoc for NaN handling. + level.isDataAbove |= bit; } }
