This is an automated email from the ASF dual-hosted git repository. rmannibucau pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/johnzon.git
The following commit(s) were added to refs/heads/master by this push: new 651b38d [JOHNZON-342] avoid too much reflection in PerHierarchyAndLexicographicalOrderFieldComparator 651b38d is described below commit 651b38dca544c3d6043a378b22c1c5cd1fe6eec2 Author: Romain Manni-Bucau <rmannibu...@gmail.com> AuthorDate: Fri May 7 20:05:08 2021 +0200 [JOHNZON-342] avoid too much reflection in PerHierarchyAndLexicographicalOrderFieldComparator --- .../PerHierarchyAndLexicographicalOrderFieldComparator.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java index 83f1deb..48948f6 100644 --- a/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java +++ b/johnzon-jsonb/src/main/java/org/apache/johnzon/jsonb/order/PerHierarchyAndLexicographicalOrderFieldComparator.java @@ -19,9 +19,12 @@ package org.apache.johnzon.jsonb.order; import java.util.Comparator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class PerHierarchyAndLexicographicalOrderFieldComparator implements Comparator<String> { private final Class<?> clazz; + private final Map<String, Integer> distances = new ConcurrentHashMap<>(); public PerHierarchyAndLexicographicalOrderFieldComparator(final Class<?> clazz) { this.clazz = clazz; @@ -29,6 +32,9 @@ public class PerHierarchyAndLexicographicalOrderFieldComparator implements Compa @Override public int compare(final String o1, final String o2) { + if (o1.equals(o2)) { + return 0; + } final int d1 = distance(o1); final int d2 = distance(o2); final int res = d2 - d1; // reversed! @@ -39,6 +45,10 @@ public class PerHierarchyAndLexicographicalOrderFieldComparator implements Compa } private int distance(final String o1) { + return distances.computeIfAbsent(o1, this::slowDistance); + } + + private int slowDistance(String o1) { Class<?> current = clazz; int i = 0; while (current != null && current != Object.class) {