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) {

Reply via email to